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();
   }
   
   }
  }
  
 }
}

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 查环保要停业整改一个月怎么办 抽油烟机管道公共排烟道漏烟怎么办 深圳龙华电动车被交警扣了怎么办 英国平邮寄到中国丢件怎么办 安卓app与设备不兼容怎么办 手机卡坏了收不到快递短信怎么办 pph手术后钛钉没有脱落怎么办 右侧附件囊状透明声可怎么办 刚刚出生小孩睾丸没有掉下来怎么办 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办