已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android -snake源码分析代码结构分析:Snake : 主游戏窗口SnakeView: 游戏视图类,是实现游戏的主体类TileView : 一个处理图片或其它Coordinate :这是一个包括两个参数,用于记录X轴和Y轴简单类,其中包括一个比较函数.RefshHandler :用于更新视图Snake这个类是游戏的主游戏窗口,是框架容器。1. 游戏的开始:oncreate此外的亮点是:setContentView(R.layout.snake_layout);设置窗口的布局文件,这里Android123给大家说明的是,这里 的snake_layout使用了自定义资源标签的方式,大家注意学习:这里我们可以看到来自SnakeView这个派生类的名称,由于Android内 部的R.资源不包含SnakeView类,所以我们必须写清楚Package,比如 com.exmple.android.snake.SnakeView 然后和其他控件使用一样,都是一个id然后宽度、高度、以及自定义的标签tileSize(尾巴长度),如下:2. onPause:关于这点,大家可以参考下在我blog中关于active生命周期/admin/blogs/379826在玩游戏过程中,如果有来电或是其它事件中断,这时应该把当前状态保存。以便返回时,还可以继续玩游戏。这就使用onSaveInstanceState实现保存当前状态。TileView注:此部分解析来自: Android示例程序Snake贪食蛇代码分析(三)TileView,从名称上不难看出这是一个方砖类,就是生成一个方块。 TileView使用了Android平台的显示基类View,View类是直接从java.lang.Object派生出来的,是各种控件比如 TextView、EditView的基类,当然包括我们的窗口Activity类,这些在SDK文档中都说的比较清楚。这里定义了 5个int型全局的变量,分别是方砖的数量mTileSize;方砖水平x防线的数量mXTileCount;以及竖直y方向上的方砖数量 mYTileCount,下面是一个相对偏移位置mXOffset和mYOffset;这里android123主让要大家了解如何自定义View在 Android开发中,在一个View类中主要是重写onSizeChanged方法来控制改变部分,以及onDraw实现画布的修改,实现的简写如下:Override protected void onSizeChanged(int w, int h, int oldw, int oldh) Override public void onDraw(Canvas canvas) super.onDraw(canvas);我们自定义的TileView类需要自己添加一个构造方法,根据需要,我们还重载了一种包含样式的方法,这里大家可以多看下Gallery控件的实现,就好理解了,下面是基本框架。public TileView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);public TileView(Context context, AttributeSet attrs) super(context, attrs);在贪食蛇游戏中我们知道Snake是移动的,所以加入了一个清除显示的clearTiles方法,通过一个二维数组保存一个gird网格型的运动轨迹,下一次我们将会讲解android贪食蛇的游戏逻辑和完整的关联拼接实现。SnakeView在这个类中实现的游戏的实体,从游戏需求的角色,这个游戏包括了如下方面:1 随机产生小苹果,apples这里是复数,当然是是大于1个苹果,所以代码中产生了两个苹果。2 游戏状态管理3 画蛇,view的更新4 吃掉苹果后小蛇状态的变化5 画围墙如果实现吃掉苹果小蛇速度变快?关键是:mMoveDelay这个变量,以下是涉及到这个变量的函数,每次吃掉苹果后,就会updateSnake一下,里面就把时间处理了:mMoveDelay *= 0.9;小蛇其实就是一个数组,google的代码就是好注释写的清楚:/* * mSnakeTrail: a list of Coordinates that make up the snakes body * mAppleList: the secret location of the juicy apples the snake craves. */private ArrayList mSnakeTrail = new ArrayList();private ArrayList mAppleList = new ArrayList();mSnakeTrail:一个由Coordinates列表组织的蛇身.mAppleList:存放鲜美多汁的苹果列表通过这个数组画出小蛇不难,问题是如何判断游戏是否结束?问题是如何判断游戏的状态所有以下的代码来自updateSnake1 吃了苹果/ Look for apples int applecount = mAppleList.size(); for (int appleindex = 0; appleindex applecount; appleindex+) Coordinate c = mAppleList.get(appleindex); if (c.equals(newHead) mAppleList.remove(c); addRandomApple(); mScore+; mMoveDelay *= 0.9; growSnake = true; 2 碰到了自己/ Look for collisions with itself int snakelength = mSnakeTrail.size(); for (int snakeindex = 0; snakeindex snakelength; snakeindex+) Coordinate c = mSnakeTrail.get(snakeindex); if (c.equals(newHead) setMode(LOSE); return; 3碰到墙了/ Collision detection / For now we have a 1-square wall around the entire arena if (newHead.x 1) | (newHead.y mXTileCount - 2) | (newHead.y mYTileCount - 2) setMode(LOSE); return; 源代码分析Snake状态分析:在snakeView中定义了snake游戏的几种状态: private int mMode = READY; public static final int PAUSE = 0;/暂定 public static final int READY = 1;/准备好了 public static final int RUNNING = 2;/正在运行public static final int LOSE = 3;/结束,输了游戏各种游戏状态 rady runningpausedlose以上状态是通过:void setMode(int newMode)函数实现。如何实现画出小方块:参看:/blog/206706public class DrawView extends View private final int mTileSize = 12;private final String TAG=DEMO;private Paint pa = new Paint();private Bitmap mTileArray;void loadImage()Resources r = this.getContext().getResources();Drawable tile = r.getDrawable(R.drawable.redstar);Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tile.setBounds(0, 0, mTileSize, mTileSize);tile.draw(canvas);mTileArray = bitmap;public DrawView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);/ TODO Auto-generated constructor stubloadImage();x = 10;y = 10;Log.i(TAG, DrawView 2);/如果没有这段代码,大家可以试一下,改用上面的代码,程序能否通过。public DrawView(Context context, AttributeSet attrs) super(context, attrs);/ TODO Auto-generated constructor stubloadImage();Log.i(TAG, DrawView 3);Overrideprotected void onDraw(Canvas canvas) super.onDraw(canvas);Log.i(TAG, onDraw 1);canvas.drawBitmap(mTileArray, x, y, pa);通过上面的文章可以画出小方块,但注意到SnakeView一共有两构造函数,那个函数才真正起作用呢?l public SnakeView(Context context, AttributeSet attrs)l public SnakeView(Context context, AttributeSet attrs, int defStyle)通过加log的方式,判断是第一个构造函数起作用。在第一个构造函数上方有一段注释:通过XML文件构造出SnakeView * Constructs a SnakeView based on inflation from XML如果不使用这个构造函数,将会造成错误,可以试一下,看一下结果是怎样!本人得到如下的错误提示:05-21 14:13:26.079: ERROR/AndroidRuntime(711): Caused by: java.lang.NoSuchMethodException: DrawView按键处理: public boolean onKeyDown(int keyCode, KeyEvent event) / TODO Auto-generated method stub if (keyCode = KeyEvent.KEYCODE_DPAD_UP) Log.i(TAG, KEYCODE_DPAD_UP); return super.onKeyDown(keyCode, event);如何让我们的小方块动起来?实现小方块动起来的秘密在于view的public void invalidate () 大家可以参看SDK文档中关于View中Drawing中的一小段话To force a view to draw, call invalidate()./为了让view重画,可以调用invalidate函数方法:1. 在DrawView类中添加两个成员:private int x,y;同时实现get,set方法,2. 在构造函数中添加他们的初始值,3. 修改onDrawOverrideprotected void onDraw(Canvas canvas) super.onDraw(canvas);Log.i(TAG, onDraw 1);canvas.drawBitmap(mTileArray, x, y, pa);4修改onKeyDown函数Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) / TODO Auto-generated method stub if (keyCode = KeyEvent.KEYCODE_DPAD_UP) Log.i(TAG, KEYCODE_DPAD_UP); dv.setX(dv.getX()+10); dv.invalidate(); return super.onKeyDown(keyCode, event);最后运行结果如下图:附:网络上关于snake分析的三篇文章上一次我们大概讲解了下Android SDK中的演示程序Snake游戏的主框架,今天我看来看下实现的基础类TileView,从名称上不难看出这是一个方砖类,就是生成一个方块。 TileView使用了Android平台的显示基类View,View类是直接从java.lang.Object派生出来的,是各种控件比如 TextView、EditView的基类,当然包括我们的窗口Activity类,这些在SDK文档中都说的比较清楚。这里定义了 5个int型全局的变量,分别是方砖的数量mTileSize;方砖水平x防线的数量mXTileCount;以及竖直y方向上的方砖数量 mYTileCount,下面是一个相对偏移位置mXOffset和mYOffset;这里android123主让要大家了解如何自定义View在 Android开发中,在一个View类中主要是重写onSizeChanged方法来控制改变部分,以及onDraw实现画布的修改,实现的简写如下:Override protected void onSizeChanged(int w, int h, int oldw, int oldh) Override public void onDraw(Canvas canvas) super.onDraw(canvas);我们自定义的TileView类需要自己添加一个构造方法,根据需要,我们还重载了一种包含样式的方法,这里大家可以多看下Gallery控件的实现,就好理解了,下面是基本框架。public TileView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);public TileView(Context context, AttributeSet attrs) super(context, attrs);在贪食蛇游戏中我们知道Snake是移动的,所以加入了一个清除显示的clearTiles方法,通过一个二维数组保存一个gird网格型的运动轨迹,下一次我们将会讲解android贪食蛇的游戏逻辑和完整的关联拼接实现。今天我们分析下最复杂的SnakeView的设计,它是派生于TileView方砖类,TileView构建是基于Android直接的显示类View,如果不明白的可以查看Android示例程序Snake贪食蛇代码分析(二)一文有关TileView类的实现,首先我们看到整个游戏分 READY、PAUSE、RUNNING、LOSE四种mMode状态模式,分别对应准备、暂停、运行中、结束(死亡),毕竟贪食蛇没有胜利这个结果。 整个Snake的运行分4个方向,NORTH、SOUTH、EAST、WEST分别
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 饮料生产企业质量控制系统方案
- 变电站设备安装与验收技术方案
- 建筑工程质量检测项目标准参数及实施方案
- 翻译专业大学实习周记原创范文集
- 水利工程施工监理规范解读
- 餐饮企业原材料成本控制与账务管理
- 篮球技巧教学及训练方案
- 2025年煤矿矿山安全检测仪器维护人员年度维护技能试卷及答案
- 物流仓储安全检查标准操作程序
- 影视剧拍摄场地安全保障措施
- T-CHATA 023-2022 结核病定点医疗机构结核感染预防与控制规范
- 2025年中国素描本行业市场分析及投资价值评估前景预测报告
- 婴幼儿心肺复苏课件
- 中职创意美术课件
- 2025年时事政治热点题库道及参考答案
- GB/T 17219-2025生活饮用水输配水设备、防护材料及水处理材料卫生安全评价
- DB6110T 007-2021 天麻大田种植技术规程
- GB/T 46141-2025智慧城市基础设施智慧交通数字化支付应用指南
- 知道智慧树我们身边的知识产权满分测试答案
- 2025 年小升初成都市初一新生分班考试语文试卷(带答案解析)-(部编版)
- 化学信息学考核试卷
评论
0/150
提交评论