Android示例程序Snake贪吃蛇代码解析

无鸯 发布于 2011/09/15 09:35
阅读 6K+
收藏 3

通过Android SDK中的Sample文件夹中的Snake示例这个简单的贪食蛇游戏让我们好好了解一下Android平台窗口View显示类开发中的相关问题。

1. 我们直接在Eclipse中导入这个工程,可以看到在Snake.java的入口onCreate方法中第一句 requestWindowFeature(Window.FEATURE_NO_TITLE);通过这句窗口特性请求,我们使用 Window.FEATURE_NO_TITLE就可以轻松的让窗口做到了无标题显示。

2.setContentView(R.layout.snake_layout);设置窗口的布局文件,这里Android123给大家说明的 是,这里 的snake_layout使用了自定义资源标签的方式,大家注意学习:这里我们可以看到来自SnakeView这个派生类的名称,由于Android内 部的R.资源不包含SnakeView类,所以我们必须写清楚Package,比如 com.exmple.android.snake.SnakeView 然后和其他控件使用一样,都是一个id然后宽度、高度、以及自定义的标签tileSize(尾巴长度),如下:

<com.example.android.snake.SnakeView
android:id=”@+id/snake”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
tileSize=”12″
/>

3.这里Snake作为主游戏窗口,包含了重载的暂停Activity,通过Avtivites类的生命周期我们可以了解到,当窗口切换到后台时会自动调用这个重写的方法,类似C++的纯虚函数,如下:

@Override
protected void onPause() { 
    super.onPause();
}

4.同时在游戏退出时重写了onSaveInstanceState方法来保存窗口实例,就是游戏的进度。

@Override
public void onSaveInstanceState(Bundle outState) {}

这里我们就简单说明下简单游戏的框架设计,以后继续为大家详细分析。

前一篇文章我们大概讲解了下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,如果不明白的可以查看前面有关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.getDrawable(R.drawable.redstar)获取资源名为redstar的资源,返回的是一个Drawable对象。

对于按键信息,直接重写View类的onKeyDown方法,这里KeyEvent传递的是按键的映射,比如KEYCODE_DPAD_UP向上,KeyEvent.KEYCODE_DPAD_DOWN向下等等,详细的查看SDK中的onKeyDown

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {

if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {}

}

整个游戏的控制流程就是上面这些,对于游戏的逻辑而言比较简单,这个贪食蛇并没有包含3D设计和类似Nokia的能量走廊、6边形轨迹,有空了我们一起来完善一个3D的贪食蛇游戏。

加载中
返回顶部
顶部