android游戏开发--三国无双(一)
来源:互联网 发布:软件展览会 编辑:程序博客网 时间:2024/06/09 20:05
好啦,博客终于开起来了,大家一起Hi起来吧。
首先,把论坛的surfaceView拷过来,以免遗漏。
package com.dsl.mygame;
import java.io.InputStream;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import com.dsl.views.PKSurface;
public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback, Runnable {
/** 单格地图宽高 **/
private static int TITLE_HEIGHT = 30;
private static int TITLE_WIDTH = 30;
/** 地图总块数 **/
private static int TITLE_HEIGHT_BIG = 27;
private static int TITLE_WIDTH_BIG = 27;
/** 地图总宽高 **/
private final static int MAP_WIDTH = 810;
private final static int MAP_HEIGHT = 810;
/** 行走方向变量 **/
private final static int MOVE_LEFT = 3;
private final static int MOVE_TOP = 2;
private final static int MOVE_RIGHT = 1;
private final static int MOVE_BUTTON = 0;
private final static int ANIM_COUNT = 4;
private static int SHITOU_X=820;
private static int SHITOU_Y=820;
/** 主角坐标 **/
private int mHeroPosX;
private int mHeroPosY;
/** 主角所处的块数 **/
private int mHeroIndexX;
private int mHeroIndexY;
private boolean isEnd = true;
private long currentTime;
/** 主角行走步长 **/
public final static int HERO_STEP = 10;
private boolean isLeft, isTop, isRight, isDown, mKeyDown;
/** 主角行走动画绘制类 **/
Animation mHeroAnim[] = new Animation[ANIM_COUNT];
// 当前绘制动画状态ID
int mAnimationState = 0;
/** 不绘制的标识 **/
public final static int TITLE_NULL = 0;
/** 野外地图与战斗地图跳转控制 **/
public static boolean isThreadStart = false;
/** 屏幕宽高 **/
public int mScreenWidth = 0;
public int mScreenHeight = 0;
/** 各种资源 **/
Bitmap mBitmap = null;
Resources mResource = null;
Paint mPaint = null;
Bitmap bm_shitou=null;
/** 主绘制线程 **/
Thread mThread;
/** 野外地图与战斗地图跳转线程 **/
TimeThread timeThread;
SurfaceHolder mholder;
Canvas cs;
Activity mContext;
/** 主角类,声明为静态的是方便切换到战斗状态时数据交互 **/
public static Hero mHero;
int mWidthTitleCount = 0;
int mHeightTitleCount = 0;
int mBitMapWidth = 0;
int mBitMapHeight = 0;
int mCameraPosX = 0;
int mCameraPosY = 0;
int mMapPosX = 0;
int mMapPosY = 0;
int backPosX = 210;
int backPosY = 0;
/** 背景地图数组 **/
private int map[][] = {
{ 237, 237, 237, 237, 237, 237, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 237, 67, 67, 67, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 66, 66, 66, 66, 66, 66, 66,
66, 66, 66, 66, 66, 66, 237, 66, 66, 66, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 66, 66, 66, 66, 66, 66, 66,
66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 66, 66, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 66, 66, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 67, 67, 68, 68, 68, 68, 68, 68, 68,
237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 68, 68, 68, 68, 68, 68,
237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 68, 68, 68, 68, 68, 68,
237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 68, 68, 68, 68, 68, 68, 68,
237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 68, 68, 68, 68, 66, 66, 66,
66, 66, 66, 237, 237, 237, 237, 68, 68, 68, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 68, 68, 68, 68, 66, 66, 66,
66, 66, 66, 237, 237, 237, 237, 68, 68, 68, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 66, 66, 66, 66, 66, 66,
237, 237, 66, 66, 237, 237, 237, 237, 66, 66, 66, 66, 66 },
{ 237, 237, 237, 237, 237, 237, 66, 66, 66, 66, 66, 66, 66, 66,
237, 237, 66, 66, 66, 66, 66, 66, 66, 66, 66, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 68,
237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 237, 237, 237, 237,
237, 237, 68, 68, 68, 68, 68, 237, 68, 68, 68, 237, 237,
237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 237, 237, 237, 237,
237, 237, 68, 68, 68, 68, 68, 237, 68, 68, 68, 237, 237,
237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 237, 237, 237, 237,
237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 237, 237, 237, 237,
237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 247, 247, 247, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 237, 237, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 237, 237, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 68, 68, 68, 68, 68, 68, 68, 68, 68,
68, 68, 68, 68, 68, 68, 68, 68, 68, 237, 237, 237 },
{ 237, 237, 237, 237, 237, 237, 232, 237, 237, 237, 237, 237, 237,
237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 68, 237,
237, 237 },
{ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
237, 237 },
{ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237,
237, 237 } };
/** 实体地图数组 **/
private int map2[][] = {
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 100, 102 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 210, 0, 0, 0, 100, 118 },
{ 145, 131, 132, 148, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 226, 0, 0, 0, 100, 99 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 100, 115 },
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 71, 103,
104, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 87, 119,
120, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 88,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73, 74, 75, 76, 0, 0, 0, 0, 0 },
{ 161, 147, 148, 132, 148, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
89, 90, 91, 92, 0, 0, 0, 0, 0 },
{ 145, 131, 132, 131, 132, 146, 0, 0, 0, 0, 0, 0, 0, 0, 163, 164,
0, 0, 105, 106, 107, 108, 0, 0, 0, 0, 0 },
{ 161, 162, 161, 162, 161, 162, 0, 0, 0, 0, 0, 0, 0, 0, 179, 180,
0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 196, 0, 0, 0, 0,
0, 0, 0, 0, 71, 103, 104 },
{ 177, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 87, 119, 120 },
{ 193, 194, 0, 0, 0, 0, 0, 0, 0, 216, 216, 216, 216, 216, 216, 0,
0, 0, 0, 0, 211, 0, 0, 0, 71, 103, 104 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 77, 78, 79, 80, 216, 0, 0, 0, 0,
0, 227, 0, 0, 0, 87, 119, 120 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 93, 94, 95, 96, 216, 0, 0, 0, 0,
0, 0, 0, 0, 0, 71, 103, 104 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 109, 110, 111, 112, 216, 0, 0, 0,
0, 0, 0, 0, 0, 0, 87, 119, 120 },
{ 0, 220, 221, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 71, 103, 104 },
{ 209, 236, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
187, 189, 0, 0, 0, 87, 119, 120 },
{ 225, 252, 253, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
204, 205, 0, 0, 0, 71, 103, 104 },
{ 241, 0, 0, 0, 212, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 87, 119, 120 },
{ 0, 0, 0, 0, 228, 229, 0, 71, 72, 71, 72, 71, 72, 71, 72, 71, 72,
71, 72, 71, 72, 71, 72, 0, 71, 103, 104 },
{ 0, 0, 0, 0, 244, 245, 71, 103, 104, 103, 104, 103, 104, 103, 104,
103, 104, 103, 104, 103, 104, 103, 104, 72, 87, 119, 120 },
{ 0, 0, 0, 0, 0, 0, 87, 119, 120, 119, 120, 119, 120, 119, 120,
119, 120, 119, 120, 119, 120, 119, 120, 88, 71, 103, 104 } };
/** 碰撞数组,该层不绘制 **/
private int map3[][] = {
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -1, -1 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, -1, -1 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, -1, 0, 0, 0, -1, -1 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, -1, -1 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1,
0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1,
0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
-1, -1, -1, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
-1, -1, -1, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1,
-1, -1, -1, 0, 0, 0, 0, 0 },
{ -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0,
0, 0, 0, 0, 0, 0, -1, -1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0,
0, 0, 0, -1, -1, -1 },
{ -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -1, -1, -1 },
{ -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0,
0, -1, 0, 0, 0, -1, -1, -1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0,
-1, 0, 0, 0, -1, -1, -1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, -1, -1 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0,
0, 0, 0, 0, -1, -1, -1 },
{ 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -1, -1, -1 },
{ -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
-1, 0, 0, 0, -1, -1, -1 },
{ -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
-1, 0, 0, 0, -1, -1, -1 },
{ -1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, -1, -1, -1 },
{ 0, 0, 0, 0, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 0, -1, -1, -1 },
{ 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
{ 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1 } };
/** 初始化英雄数据 **/
private void initHero() {
mHero.x = 210;
mHero.y = 0;
/** 根据图片显示的坐标算出英雄脚底的坐标 **/
/** X轴+图片宽度的一半 Y轴加图片的高度 **/
mHeroPosX = mHero.x + mHero.width / 2;
mHeroPosY = mHero.y + mHero.height;
mHeroIndexX = mHeroPosX / TITLE_WIDTH;
mHeroIndexY = mHeroPosY / TITLE_HEIGHT;
mHero.screenX = mHeroPosX;
mHero.screenY = mHeroPosY;
}
/** 绘制升级图像 **/
public void drawLive(){
cs.drawBitmap(bm_shitou, SHITOU_X, SHITOU_Y, mPaint);
}
/** 判断是否升级 **/
public void LiveUp(){
System.out.println("before experience-->"+mHero.experience);
if(mHero.currentExperience>=mHero.experience){
mHero.live++;
mHero.experience+=mHero.experience/2;
mHero.currentExperience=0;
shitou_move();
}
System.out.println("after experience-->"+mHero.experience);
}
/** 将缓存中的升级图像挪过来 **/
public void shitou_move() {
long aTime = System.currentTimeMillis();
int i = 0;
boolean a = true;
while (a) {
long tTime = System.currentTimeMillis();
if (tTime - aTime >= 500) {
aTime = tTime;
switch (i) {
case 0:
SHITOU_X = mHero.x;
SHITOU_Y = mHero.y;
break;
case 1:
SHITOU_X = 820;
SHITOU_Y = 820;
break;
}
if (i == 1) {
a = false;
}
i++;
}
}
}
public Bitmap revort(int id, int x, int y) {
Bitmap bm = BitmapFactory.decodeStream(getResources().openRawResource(
id));
// 获得图片的宽高
int width = bm.getWidth();
int height = bm.getHeight();
// 设置想要的大小
int newWidth = x;
int newHeight = y;
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,
true);
return newbm;
}
/** 主绘制函数,将会再主线程的run里被调用 **/
public void myDrow() {
DrawMap(cs, mPaint, mBitmap);
updateCamera();
RenderAnimation(cs);
drawLive();
}
/** 碰撞检测 **/
public void check() {
mHeroPosX = mHero.x + mHero.width / 2;
mHeroPosY = mHero.y + mHero.height;
mHeroIndexX = mHeroPosX / TITLE_WIDTH;
mHeroIndexY = mHeroPosY / TITLE_HEIGHT;
if (map3[mHeroIndexY][mHeroIndexX] == -1) {
mHero.x = backPosX;
mHero.y = backPosY;
} else {
backPosX = mHero.x;
backPosY = mHero.y;
}
}
/** 渲染主角移动动画 **/
private void RenderAnimation(Canvas cs2) {
// TODO Auto-generated method stub
if (mKeyDown) {
/** 绘制主角动画 **/
mHeroAnim[mAnimationState].DrawAnimation(cs2, mPaint, mHero.x,
mHero.y);
} else {
/** 按键抬起后人物停止动画 **/
mHeroAnim[mAnimationState].DrawFrame(cs2, mPaint, mHero.x, mHero.y,
0);
}
}
/**
* 更新摄像头,所谓摄像头,就是你的手机屏幕的一个说法
* 实际是主角不动,地图移动
* **/
public void updateCamera(int keyCode) {
switch (keyCode) {
case MOVE_BUTTON:
if (mScreenHeight + mCameraPosY < MAP_HEIGHT) {
mCameraPosY += HERO_STEP;
mMapPosY = -mCameraPosY;
} else if (mHero.y + mHero.height + HERO_STEP <= MAP_HEIGHT
- mCameraPosY) {
System.out.println(mHero.y + mHero.height + HERO_STEP);
System.out.println(MAP_HEIGHT - mCameraPosY);
mHero.y += HERO_STEP;
}
break;
case MOVE_TOP:
if (mCameraPosY > 0) {
mCameraPosY -= HERO_STEP;
mMapPosY = -mCameraPosY;
} else if (mHero.y > 0) {
mHero.y -= HERO_STEP;
}
break;
case MOVE_LEFT:
if (mCameraPosX > 0) {
mCameraPosX -= HERO_STEP;
mMapPosX = -mCameraPosX;
} else if (mHero.x > 0) {
mHero.x -= HERO_STEP;
}
break;
case MOVE_RIGHT:
if (mScreenWidth + mCameraPosX < MAP_WIDTH) {
mCameraPosX += HERO_STEP;
mMapPosX = -mCameraPosX;
} else if (mHero.x + mHero.width < MAP_WIDTH - mCameraPosX) {
mHero.x += HERO_STEP;
}
break;
}
}
/** 同上,只是这个函数少了个参数 **/
public void updateCamera() {
long time = System.currentTimeMillis();
if (!isEnd) {
if (time - currentTime >= 100) {
currentTime = time;
switch (mAnimationState) {
case MOVE_BUTTON:
if (mScreenHeight + mCameraPosY < MAP_HEIGHT) {
mCameraPosY += HERO_STEP;
mMapPosY = -mCameraPosY;
// mHero.y+=HERO_STEP;
} else if (mHero.y + mHero.height + HERO_STEP < MAP_HEIGHT
- mCameraPosY) {
mHero.y += HERO_STEP;
}
break;
case MOVE_TOP:
if (mCameraPosY > 0) {
mCameraPosY -= HERO_STEP;
mMapPosY = -mCameraPosY;
} else if (mHero.y > 0) {
mHero.y -= HERO_STEP;
}
break;
case MOVE_LEFT:
if (mCameraPosX > 0) {
mCameraPosX -= HERO_STEP;
mMapPosX = -mCameraPosX;
} else if (mHero.x > 0) {
mHero.x -= HERO_STEP;
}
break;
case MOVE_RIGHT:
if (mScreenWidth + mCameraPosX < MAP_WIDTH) {
mCameraPosX += HERO_STEP;
mMapPosX = -mCameraPosX;
} else if (mHero.x + mHero.width < MAP_WIDTH - mCameraPosX) {
mHero.x += HERO_STEP;
}
break;
}
}
}
}
/**
* 设置按键状态true为按下 false为抬起
*
* @param keyCode
* @param state
*/
public void setKeyState(int keyCode, boolean state) {
switch (keyCode) {
case MOVE_BUTTON:
isDown = state;
break;
case MOVE_TOP:
isTop = state;
break;
case MOVE_LEFT:
isLeft = state;
break;
case MOVE_RIGHT:
isRight = state;
break;
}
mAnimationState = keyCode;
mKeyDown = state;
}
/** 初始化 **/
public MySurfaceView(Context context, int width, int height) {
super(context);
// TODO Auto-generated constructor stub
mContext = (Activity) context;
mPaint = new Paint();
mBitmap = ReadBitMap(context, R.drawable.bb);
bm_shitou = revort(R.drawable.live_up, 40, 50);
mBitMapWidth = mBitmap.getWidth();
mBitMapHeight = mBitmap.getHeight();
mWidthTitleCount = mBitMapWidth / TITLE_WIDTH;
mHeightTitleCount = mBitMapWidth / TITLE_HEIGHT;
mScreenHeight = height;
mScreenWidth = width;
mholder = getHolder();
mholder.addCallback(this);
mHero = new Hero(this);
initHero();
initAnimation(mContext);
}
/** 绘制地图的主函数 **/
private void DrawMap(Canvas canvas, Paint p, Bitmap b) {
int i, j;
for (i = 0; i < TITLE_HEIGHT_BIG; i++) {
for (j = 0; j < TITLE_WIDTH_BIG; j++) {
int ViewID = map[i][j];
int ActorID = map2[i][j];
int x = j * TITLE_WIDTH + mMapPosX;
int y = i * TITLE_HEIGHT + mMapPosY;
if (ViewID > TITLE_NULL) {
DrawMapTITLE(ViewID, canvas, p, b, x, y);
}
if (ActorID > TITLE_NULL) {
DrawMapTITLE(ActorID, canvas, p, b, x, y);
}
}
}
}
private void initAnimation(Context context) {
// 这里可以用循环来处理总之我们需要把动画的ID传进去
mHeroAnim[MOVE_LEFT] = new Animation(context, new int[] {
R.drawable.c5, R.drawable.c6, R.drawable.c7, R.drawable.c8 },
true);
mHeroAnim[MOVE_TOP] = new Animation(context,
new int[] { R.drawable.c13, R.drawable.c14, R.drawable.c15,
R.drawable.c16 }, true);
mHeroAnim[MOVE_RIGHT] = new Animation(context,
new int[] { R.drawable.c9, R.drawable.c10, R.drawable.c11,
R.drawable.c12 }, true);
mHeroAnim[MOVE_BUTTON] = new Animation(context, new int[] {
R.drawable.c1, R.drawable.c2, R.drawable.c3, R.drawable.c4 },
true);
}
/** 根据地图块的ID来绘制每一块 **/
private void DrawMapTITLE(int id, Canvas canvas, Paint p, Bitmap b, int x,
int y) {
// TODO Auto-generated method stub
id--;
int count = id / mWidthTitleCount;
int bitmapX = (id - (count * mWidthTitleCount)) * TITLE_WIDTH;
int bitmapY = count * TITLE_HEIGHT;
DrawClipImage(canvas, p, b, x, y, bitmapX, bitmapY, TITLE_WIDTH,
TITLE_HEIGHT);
}
/** 具体的绘制函数 **/
private void DrawClipImage(Canvas canvas, Paint p, Bitmap b, int x, int y,
int bitmapX, int bitmapY, int src_xp, int src_yp) {
// TODO Auto-generated method stub
canvas.save();
canvas.clipRect(x, y, x + src_xp, y + src_yp);
canvas.drawBitmap(b, x - bitmapX, y - bitmapY, p);
canvas.restore();
}
/** 根据Resourse的ID获取图片 **/
private Bitmap ReadBitMap(Context context, int bb) {
// TODO Auto-generated method stub
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream is = context.getResources().openRawResource(bb);
return BitmapFactory.decodeStream(is, null, opt);
}
/** SurfaceView主run函数,实现绘制整个画面 **/
public void run() {
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
LiveUp();
}
}).start();
// TODO Auto-generated method stub
while (isThreadStart) {
// 在这里加上线程安全锁
synchronized (mholder) {
try {
cs = mholder.lockCanvas();
check();
myDrow();
} catch (Exception e) {
e.printStackTrace();
} finally {
/**
*
* 这里必须要用finally,因为为了防止切换场景后
* 绘制的地图还没提交
* 绘制结束后解锁显示在屏幕上
*
*
* **/
mholder.unlockCanvasAndPost(cs);
}
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
/** surface创建时启动主线程与场景切换线程 **/
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mThread = new Thread(this);
isThreadStart = true;
mThread.start();
timeThread=new TimeThread();
isTimePase=true;
timeThread.start();
}
/**
*
* 这里比较重要,surface挂掉之后必须把两个线程干掉
*
* **/
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
isThreadStart = false;
isTimePase=false;
}
/**
*
* 触屏事件截获,主要截获手指是再屏幕上下左右4个方位的哪里,然后执行相应动作
*
* **/
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int direction = checkTouch(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
setKeyState(direction, true);
isEnd = false;
currentTime = System.currentTimeMillis();
updateCamera(direction);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
setKeyState(direction, false);
isEnd = true;
}
return true;
}
/** 同上 **/
public int checkTouch(MotionEvent event) {
int move = 0;
float currentX = event.getX();
float currentY = event.getY();
if (currentY < mScreenHeight / 3) {
move = MOVE_TOP;
} else if (currentY > mScreenHeight * 2 / 3) {
move = MOVE_BUTTON;
} else if (currentY >= mScreenHeight / 3
&& currentY <= mScreenHeight * 2 / 3
&& currentX < mScreenWidth / 2) {
move = MOVE_LEFT;
} else if (currentY >= mScreenHeight / 3
&& currentY <= mScreenHeight * 2 / 3
&& currentX > mScreenWidth / 2) {
move = MOVE_RIGHT;
}
return move;
}
/**
*
* 切换场景的Handler
*
**/
Handler h=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//super.handleMessage(msg);
if(msg.what==1){
isThreadStart=false;
isTimePase=false;
mContext.setContentView(new PKSurface(mContext,mScreenWidth,mScreenHeight,MySurfaceView.this));
}
}
};
public boolean isTimePase=false;
/**
* 切换场景的主线程
**/
class TimeThread extends Thread{
@Override
public void run() {
Looper.prepare();
// TODO Auto-generated method stub
int i=1;
while(isTimePase){
try {
Thread.sleep(15000+(int)(Math.random()*15000));
h.sendEmptyMessage(i);
i++;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
- android游戏开发--三国无双(一)
- android手机游戏-三国无双(二)
- unity实现war3真三国无双(一)资源提取
- 真三国无双4
- 三国无双模型数据结构。。。
- 真三国无双
- ACM:真三国无双
- 三国游戏开发策略
- 三国游戏开发策略
- 三国征途=三国志+三国无双?
- csu 1020 真三国无双
- CSU1020-真三国无双-模拟
- 《真三国无双5》全人研究完整版
- 真三国无双3 己方士气提升
- 开发三国游戏ing, 玩得开心
- 三国游戏
- 三国游戏
- 三国塔防游戏android源码
- PMO的失败之旅——开发部门老大带队
- char*和CString转换
- NAS网络存储(1)
- struct2 返回json ,xml
- Facebook移动应用开发经验分享:基于用户不忘本心
- android游戏开发--三国无双(一)
- SubSonic 开源的代码生成器
- 你还在用System.out.println吗?经过静态引用包你可以使用我的print啦!
- struts2标签详解
- 在eclipse环境下搭建一个axis2工程
- 自学cocos2d-x之tests工程结构
- 我要学ASP.NET MVC 3.0(四): 我要MVC潜规则之配置Routing
- 内核态用vmalloc申请大块内存
- Linux驱动之Platform Driver