android 游戏 让人物动起来
2016-05-27 11:57
621 查看
public class MySurfaceView extends SurfaceView implements Callback, Runnable { private SurfaceHolder sfh; private Paint paint; private Thread th; private boolean flag; private Canvas canvas; private int screenW, screenH; //机器人位图 private Bitmap bmpRobot; //机器人的方向常量 private final int DIR_LEFT = 0; private final int DIR_RIGHT = 1; //机器人当前的方向(默认朝右方向) private int dir = DIR_RIGHT; //动作帧下标 private int currentFrame; //机器人的X,Y位置 private int robot_x, robot_y; //处理按键卡现象 private boolean isUp, isDown, isLeft, isRight; /** * SurfaceView初始化函数 */ public MySurfaceView(Context context) { super(context); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); paint.setAntiAlias(true); setFocusable(true); bmpRobot = BitmapFactory.decodeResource(this.getResources(), R.drawable.robot); } /** * SurfaceView视图创建,响应此函数 */ @Override public void surfaceCreated(SurfaceHolder holder) { screenW = this.getWidth(); screenH = this.getHeight(); flag = true; //实例线程 th = new Thread(this); //启动线程 th.start(); } /** * * @param currentFrame 绘制帧 * @param frameW * 每帧的高 * @param frameH * 每帧的高 * @param canvas * 画布实例 * @param paint * 画笔实例 */ public void drawFrame(int currentFrame, Canvas canvas, Paint paint) { int frameW = bmpRobot.getWidth() / 6; int frameH = bmpRobot.getHeight() / 2; //得到位图的列数 int col = bmpRobot.getWidth() / frameW; //得到当前帧相对于位图的X坐标 int x = currentFrame % col * frameW; //得到当前帧相对于位图的Y坐标 int y = currentFrame / col * frameH; canvas.save(); //设置一个宽高与机器人每帧相同大小的可视区域 canvas.clipRect(robot_x, robot_y, robot_x + bmpRobot.getWidth() / 6, robot_y + bmpRobot.getHeight() / 2); if (dir == DIR_LEFT) {//如果是向左侧移动 //镜像操作 canvas.scale(-1, 1, robot_x - x + bmpRobot.getWidth() / 2, robot_y - y + bmpRobot.getHeight() / 2); } //robot_x 按下后的位置 减去原来的机器人x 的位置 y 同理 canvas.drawBitmap(bmpRobot, robot_x - x, robot_y - y, paint); canvas.restore(); } /** * 游戏绘图 */ public void myDraw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); drawFrame(currentFrame, canvas, paint); } } catch (Exception e) { // TODO: handle exception } finally { if (canvas != null) sfh.unlockCanvasAndPost(canvas); } } @Override public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { Log.e("", "aaaaaaa"); return super.onKeyMultiple(keyCode, repeatCount, event); } /** * 触屏事件监听 */ @Override public boolean onTouchEvent(MotionEvent event) { return true; } /** * 按键事件监听 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { isUp = true; } if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { isDown = true; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { isLeft = true; dir = DIR_LEFT; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { isRight = true; dir = DIR_RIGHT; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { isUp = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { isDown = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { isLeft = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { isRight = false; } return super.onKeyUp(keyCode, event); } /** * 游戏逻辑 */ private void logic() { if (isUp) { robot_y -= 5; } if (isDown) { robot_y += 5; } if (isLeft) { robot_x -= 5; } if (isRight) { robot_x += 5; } currentFrame++; if (currentFrame >= 12) { currentFrame = 0; } } @Override public void run() { while (flag) { long start = System.currentTimeMillis(); myDraw(); logic(); long end = System.currentTimeMillis(); try { if (end - start < 50) { Thread.sleep(50 - (end - start)); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * SurfaceView视图状态发生改变,响应此函数 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /** * SurfaceView视图消亡时,响应此函数 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { flag = false; } }
相关文章推荐
- Android中Handler消息处理机制原理
- 【Android 应用开发】GitHub 优秀的 Android 开源项目
- Android自定义View
- 我的《Android官方开发文档Training系列课程中文版》的中期翻译计划
- Android实现点击通知栏后,先启动应用再打开目标Activity
- Design Support Library详解
- Android中Toolbar的基本使用
- Android Launcher浅析(一)
- androidstudio开发工具下载
- 加速Android AVD SDK Update下载速度
- Android开发之armeabi
- Android 设计模式 之 单例模式
- 解决:安装Android Studio 2.0后无法查看源码
- 一起来学Android Studio:(五)导入 jar 包和第三方开源库方法
- canvas刮刮卡在三星s3和一些android4.1系统的手机上不能使用的问题
- 快捷开发 Android通用流行框架大全
- Android EditText输入最大长度限制如何给用户以友好的提示
- android 游戏 剪切图动画
- 安卓初识基本控件_SeekBar
- 关于Android的.so文件