1.游戏适屏的简述和作用

由于市面上安装 Android 系统的手机不断增多,出现了各种分辨率、各种屏幕尺寸的Android 系统手机。为了保证一个游戏或者一个软件能在所有的 Android 手机上正常显示,常用的适屏做法有:利用屏幕宽高、位图宽高来设置一些游戏元素的位置;字体的适屏做法最好的使用字体图,这样文字不会因为手机分辨率不同而不同,毕竟图片大小是固定不变的。

2.让游戏主角动起来
实例演示将一张由多行多列的动作帧组成的图片实现动态效果。

新建项目,游戏框架为SurfaceView 框架,准备图片robot.png如下:

修改MySurfaceView 类,代码如下:

package com.example.ex4_13;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implements Callback,Runnable {private SurfaceHolder sfh;private Canvas canvas;private Paint paint;private boolean flag;private Thread th;//机器人位图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;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视图创建,响应此函数*/@Overridepublic void surfaceCreated(SurfaceHolder holder) {flag = true;//实例线程th = new Thread(this);//启动线程
        th.start();}/*** SurfaceView视图状态发生改变,响应此函数*/@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}/*** SurfaceView视图消亡时,响应此函数*/@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {flag = false;}/*** 绘制函数*/private 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);}}}/*** * @param currentFrame 绘制帧* @param frameW  *             每帧的高* @param frameH *             每帧的高* @param canvas  *             画布实例* @param paint         *              画笔实例*/private 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);}canvas.drawBitmap(bmpRobot, robot_x - x, robot_y - y, paint);canvas.restore();}/*** 游戏逻辑*/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;}}@Overridepublic 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();}}}/*** 按键事件监听*/@Overridepublic 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);}@Overridepublic 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);}}

本文地址:http://www.cnblogs.com/yc-755909659/p/4179436.html

【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)相关推荐

  1. 【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)...

    1.游戏适屏的简述和作用 由于市面上安装 Android 系统的手机不断增多,出现了各种分辨率.各种屏幕尺寸的Android 系统手机.为了保证一个游戏或者一个软件能在所有的 Android 手机上正 ...

  2. 《Android游戏编程之从零开始》书评之基础的魅力

    拜读完<Android游戏编程之从零开始>的试读章节之后,感受颇深,对于游戏开发过程中用到的知识,有了初步的了解,此书就一些基本图形为例,展开对游戏开发的基本原理的阐述.本人感觉,介绍一种 ...

  3. 【通知】▁▂▃ Himi 著作《Android游戏编程之从零开始》★书籍源码+第4/6/7样章★博客系列源码整理打包-免费下载★ ▃▂▁

    2011年9月22日(Himi的22岁生日当天),Himi的著作:<Android游戏编程之从零开始>一书正式发售: (大家可以到新华书店.淘宝.拍拍.当当.亚马逊等进行购买): 感谢一直 ...

  4. [转] Himi 著作《Android游戏编程之从零开始》★书籍源码+第4/6/7样章—免费下载★...

    本文转自:http://blog.csdn.net/xiaominghimi/article/details/6802444 Himi 原创, 转载请注明出处,谢谢! 原文地址:http://blog ...

  5. [置顶]▁▂▃ Himi 著作《Android游戏编程之从零开始》★书籍源码免费下载★ ▃▂▁...

    Himi 原创, 转载请注明出处,谢谢! 原文地址:http://blog.csdn.net/xiaominghimi/article/details/6802444 2011年9月22日(Himi的 ...

  6. ★书籍源码免费下载★Himi 著作《Android游戏编程之从零开始》

    2011年9月22日(Himi的22岁生日当天),Himi的著作:<Android游戏编程之从零开始>一书正式发售:(请到书店.淘宝.当当网等进行购买) 感谢一直以来关注Himi的童鞋们. ...

  7. 【Android】Android游戏编程之从零开始

    <Android游戏编程之从零开始>主要系统地讲解了Android游戏开发,从最基础部分开始,让零基础的Android初学者也能快速学习和掌握Android游戏开发.<Android ...

  8. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  9. 【通知】▁▂▃ Himi 最新著作《iOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发》★书籍源码+第4/5/6样章★-免费下载★ ▃▂▁

    2013年新年,Himi的第二本著作:<iOS游戏编程之从零开始-Cocos2d-x与cocos2d引擎游戏开发>一书正式发售: (大家可以到新华书店.淘宝.拍拍.当当.亚马逊等进行购买) ...

  10. 【浅墨著作】 逐梦旅程 Windows游戏编程之从零开始 勘误 配套源代码下载

    这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来浅墨的博客逛一下看有没有更新,"每天都来就像看女神那般不依不舍", ...

最新文章

  1. 浅析Python中bytes和str区别
  2. 【以太坊】私有链和测试网的区别
  3. HP ALM 使用经验
  4. gpg加密命令 linux_用 PGP 保护代码完整性(四):将主密钥移到离线存储中 | Linux 中国...
  5. 【C++】Visual Studio教程(十二) -代码编辑器功能
  6. Linux下mp3文件的乱码问题
  7. ------shell学习
  8. PLSQL 申明和游标
  9. mfc的WM_PAINT笔记
  10. 人机协作机器人发展趋势_【名企】优傲机器人与佳能合作,全面进军机器人视觉市场...
  11. 2020年海南大学计算机调剂,2020年海南大学招收调剂生
  12. 存储过程出错会回滚吗_一个人做梦过程中不小心挂了,梦境会继续吗?
  13. mysql基线检查_Mysql安全基线检查
  14. Linux之安装虚拟机/虚拟操作系统[VisualBox]
  15. office彻底卸载工具
  16. win7系统安装硬盘格式转换问题
  17. nodejs中events模块的使用
  18. Zigbee入门指导(二)mdash;mdash;运行Zigbee例程
  19. Python黑马头条推荐系统第五天 头条排序模型进阶-神经网络
  20. 年报发布后市值应声暴涨300亿“京东模式”修炼多年内功终显露

热门文章

  1. 使用angrutils生成控制流图出错的解决过程
  2. 使用 kubeadm快速部署Kubernetes-v1.18
  3. NO.1 根据数组元素之和,获取对应索引
  4. iOS:主流启动优化方案浅析
  5. Python 02 编写代码
  6. LayUI中select下拉框选中触发事件
  7. cavium公司和xPliant芯片
  8. python爬虫下载文件到指定文件夹_python爬虫: 从 指定路径 爬取 文件
  9. 器械传递的方法_天津304不锈钢传递窗报价_碧海云天
  10. X window 概念及原理图