【Android源码 栏目提醒】:以下是网学会员为您推荐的Android源码 -Android-贪吃蛇源码分析 - 培训资料,希望本篇文章对您学习有所帮助。
Android ---snake源代码分析 代码结构分析 Snake 主游戏窗口 SnakeView 游戏视图类是实现游戏的主体类 TileView 一个处理图片或其它 Coordinate 这是一个包括两个参数用于记录X轴和Y轴简单类其中包括一个比较函数. RefshHandler 用于更新视图 Snake 这个类是游戏的主游戏窗口是框架容器 1. 游戏的开始oncreate此外的亮点是setContentViewR.layout.snake_layout设置窗口的布局文件这里
Android123给大家说明的是这里 的snake_layout使用了自定义资源标签的方式大家注意学习:这里我们可以看到来自SnakeView这个派生类的名称由于
Android内 部的R.资源不包含SnakeView类所以我们必须写清楚Package比如 com.exmple.
android.snake.SnakeView 然后和其他控件使用一样都是一个id然后宽度、高度、以及自定义的标签tileSize尾巴长度如下: 2. onPause:关于这点大家可以参考下在我blog中关于active生命周期http://xusaomaiss.javaeye.com/admin/blogs/379826 在玩游戏过程中如果有来电或是其它事件中断这时应该把当前状态保存。
以便返回时还可以继续玩游戏。
这就使用onSaveInstanceState实现保存当前状态。
TileView 注此部分解析来自:
Android示例程序Snake贪食蛇代码分析三 TileView从名称上不难看出这是一个方砖类就是生成一个方块。
TileView使用了
Android平台的显示基类ViewView类是直接从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 onSizeChangedint w int h int oldw int oldh Override public void onDrawCanvas canvas super.onDrawcanvas 我们自定义的TileView类需要自己添加一个构造方法根据需要我们还重载了一种包含样式的方法这里大家可以多看下Gallery控件的实现就好理解了下面是基本框架。
public TileViewContext context AttributeSet attrs int defStyle supercontext attrs defStyle public TileViewContext context AttributeSet attrs supercontext 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:存放鲜美多汁的苹果列表 通过这个数组画出小蛇不难问题是如何判断游戏是否结束 问题是如何判断游戏的状态 所有以下的代码来自updateSnake 1 吃了苹果 // Look for apples int applecount mAppleList.size for int appleindex 0 appleindex applecount appleindex Coordinate c mAppleList.getappleindex if c.equalsnewHead mAppleList.removec 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.getsnakeindex if c.equalsnewHead setModeLOSE return 3碰到墙了 // Collision detection // For now we have a 1-square wall around the entire arena if newHead.x 1 newHead.y 1 newHead.x mXTileCount - 2 newHead.y mYTileCount - 2 setModeLOSE 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 running pausedlose 以上状态是通过void setModeint newMode函数实现。
如何实现画出小方块 参看http://yuefeng.javaeye.com/blog/206706 public class DrawView extends View private final int mTileSize 12 private final String TAGDEMO private Paint pa new Paint private Bitmap mTileArray void loadImage Resources r this.getContext.getResources Drawable tile r.getDrawableR.drawable.redstar Bitmap bitmap Bitmap.createBitmapmTileSize mTileSize Bitmap.Config.ARGB_8888 Canvas canvas new Canvasbitmap tile.setBounds0 0 mTileSize mTileSize tile.drawcanvas mTileArray bitmap public DrawViewContext context AttributeSet attrs int defStyle supercontext attrs defStyle // TODO Auto-generated constructor stub loadImage x 10 y 10 Log.iTAG DrawView 2 //如果没有这段代码大家可以试一下改用上面的代码程序能否通过。
public DrawViewContext context AttributeSet attrs supercontext attrs // TODO Auto-generated constructor stub loadImage Log.iTAG DrawView 3 Override protected void onDrawCanvas canvas super.onDrawcanvas Log.iTAG onDraw 1 canvas.drawBitmapmTileArray x y pa 通过上面的文章可以画出小方块但注意到SnakeView一共有两构造函数那个函数才真正起作用呢 public SnakeViewContext context AttributeSet attrs public SnakeViewContext context AttributeSet attrs int defStyle 通过加log的方式判断是第一个构造函数起作用。
在第一个构造函数上方有一段注释通过XML文件构造出SnakeView Constructs a SnakeView based on inflation from XML 如果不使用这个构造函数将会造成错误可以试一下看一下结果是怎样本人得到如下的错误提示 05-21 14:13:26.079: ERROR/AndroidRuntime711: Caused by: java.lang.NoSuchMethodException: DrawView 按键处理 public boolean onKeyDownint keyCode KeyEvent event // TODO Auto-generated method stub if keyCode KeyEvent.KEYCODE_DPAD_UP Log.iTAG KEYCODE_DPAD_UP return super.onKeyDownkeyCode event 如何让我们的小方块动起来 实现小方块动起来的秘密在于view的public void invalidate 大家可以参看SDK文档中关于View中Drawing中的一小段话 To force a view to draw call invalidate.//为了让view重画可以调用invalidate函数 方法 1. 在DrawView类中添加两个成员 private int xy 同时实现getset方法 2. 在构造函数中添加他们的初始值 3. 修改onDraw Override protected void onDrawCanvas canvas super.onDrawcanvas Log.iTAG onDraw 1 canvas.drawBitmapmTileArray x y pa 4修改onKeyDown函数 Override public boolean onKeyDownint keyCode KeyEvent event // TODO Auto-generated method stub if keyCode KeyEvent.KEYCODE_DPAD_UP Log.iTAG KEYCODE_DPAD_UP dv.setXdv.getX10 dv.invalidate return super.onKeyDownkeyCode event 最后运行结果如下图 附网络上关于snake分析的三篇文章 上一次我们大概讲解了下
Android SDK中的演示程序Snake游戏的主框架今天我看来看下实现的基础类TileView从名称上不难看出这是一个方砖类就是生成一个方块。
TileView使用了
Android平台的显示基类ViewView类是直接从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 onSizeChangedint w int h int oldw int oldh Override public void onDrawCanvas canvas super.onDrawcanvas 我们自定义的TileView类需要自己添加一个构造方法根据需要我们还重载了一种包含样式的方法这里大家可以多看下Gallery控件的实现就好理解了下面是基本框架。
public TileViewContext context AttributeSet attrs int defStyle supercontext attrs defStyle public TileViewContext context AttributeSet attrs supercontext attrs 在贪食蛇游戏中我们知道Snake是移动的所以加入了一个清除显示的clearTiles方法通过一个二维数组保存一个gird网格型的运动轨迹下一次我们将会讲解
android贪食蛇的游戏逻辑和完整的关联拼接实现。
今天我们分析下最复杂的SnakeView的设计它是派生于TileView方砖类TileView构建是基于
Android直接的显示类View如果不明白的可以查看
Android示例程序Snake贪食蛇代码分析二一文有关TileView类的实现 首先我们看到整个游戏分 READY、PAUSE 、RUNNING 、LOSE四种mMode状态模式分别对应准备、暂停、运行中、结束死亡毕竟贪食蛇没有胜利这个结果。
整个Snake的运行分4个方向NORTH、SOUTH 、EAST、WEST分别对应了北、南、东、西四个方向其中变量mDirection对应当 前的方向而mNextDirection对应下个运行时的位置。
这里星星分3种使用的是一个Drawable图片分RED_STAR、 YELLOW_STAR和GREEN_STAR三种颜色游戏的星星出现位置由Random随机数生成器来决定这里Random一般和Timer系统时 钟来随机生成更真实一些通过一个Handler对象来控制画面的更新使用了this.update和this.invalidate这两 个本地方法Update和invaildate均为
android.view.View类的本地方法。
这里资源的使用通过Resources r this.getContext.getResources获取了r对象的实例通过 r.getDrawableR.drawable.redstar获取资源名为redstar的资源返回的是一个Drawable对象。
对于按键信息直接重写View类的onKeyDown方法这里KeyEvent传递的是按键的映射比如KEYCODE_DPAD_UP向上KeyEvent.KEYCODE_DPAD_DOWN向下等等详细的查看SDK中的onKeyDown Override public boolean onKeyDownint keyCode KeyEvent msg if keyCode KeyEvent.KEYCODE_DPAD_UP 整个游戏的控制流程就是上面这些对于游戏的逻辑而言比较简单这个贪食蛇并没有包含3D设计和类似Nokia的能量走廊、6边形轨迹有空了我们一起来完善一个3D的贪食蛇游戏