当前位置:文档之家› 知识共享-Android版贪吃蛇源码及分析(雷惊风)

知识共享-Android版贪吃蛇源码及分析(雷惊风)

Android ----snake源码分析代码结构分析:Snake :主游戏窗口SnakeView:游戏视图类,是实现游戏的主体类TileView :一个处理图片或其它Coordinate :这是一个包括两个参数,用于记录X轴和Y轴简单类,其中包括一个比较函数.RefshHandler :用于更新视图Snake这个类是游戏的主游戏窗口,是框架容器。

1.游戏的开始:oncreate此外的亮点是:setContentView(yout.snake_layout);设置窗口的布局文件,这里Android123给大家说明的是,这里的snake_layout使用了自定义资源标签的方式,大家注意学习:这里我们可以看到来自SnakeView这个派生类的名称,由于Android内部的R.资源不包含SnakeView类,所以我们必须写清楚Package,比如com.exmple.android.snake.SnakeView 然后和其他控件使用一样,都是一个id然后宽度、高度、以及自定义的标签tileSize(尾巴长度),如下:<com.example.android.snake.SnakeViewandroid:id="@+id/snake"android:layout_width="fill_parent"android:layout_height="fill_parent"tileSize="12"/>2.onPause:关于这点,大家可以参考下在我blog中关于active生命周期/admin/blogs/379826在玩游戏过程中,如果有来电或是其它事件中断,这时应该把当前状态保存。

以便返回时,还可以继续玩游戏。

这就使用onSaveInstanceState实现保存当前状态。

TileView注:此部分解析来自: Android示例程序Snake贪食蛇代码分析(三)TileView,从名称上不难看出这是一个方砖类,就是生成一个方块。

TileView使用了Android平台的显示基类View,View类是直接从ng.Object派生出来的,是各种控件比如 TextView、EditView的基类,当然包括我们的窗口Activity类,这些在SDK文档中都说的比较清楚。

这里定义了 5个int型全局的变量,分别是方砖的数量mTileSize;方砖水平x防线的数量mXTileCount;以及竖直y方向上的方砖数量 mYTileCount,下面是一个相对偏移位置mXOffset和mYOffset;这里android123主让要大家了解如何自定义View在 Android开发中,在一个View类中主要是重写onSizeChanged方法来控制改变部分,以及onDraw 实现画布的修改,实现的简写如下:@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {} @Overridepublic 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 snake's body *mAppleList:the secret location of the juicy apples the snake craves.*/private ArrayList<Coordinate> mSnakeTrail= new ArrayList<Coordinate>(); private ArrayList<Coordinate> mAppleList= new ArrayList<Coordinate>();mSnakeTrail:一个由Coordinates列表组织的蛇身.mAppleList:存放鲜美多汁的苹果列表通过这个数组画出小蛇不难,问题是如何判断游戏是否结束?问题是如何判断游戏的状态所有以下的代码来自updateSnake1.吃了苹果// Look for applesint 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 itselfint 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 arenaif ((newHead.x < 1) || (newHead.y < 1) || (newHead.x > 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 runningpaused lose 以上状态是通过: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一共有两构造函数,那个函数才真正起作用呢?●public SnakeView(Context context, AttributeSet attrs)●public SnakeView(Context context, AttributeSet attrs, int defStyle)通过加log的方式,判断是第一个构造函数起作用。

相关主题