一、首先游戏设计,由于植物大战僵尸是2d游戏,最多算2.5d所以使用安卓的View完全足够。View有两个重点方法onDraw用于绘制,onTouchEvent用户触摸屏幕执行用来和用户交互。在构造函数进行相关初始化以后然后启动一个线程不断的循环执行绘图与逻辑函数这样就是一个简单的游戏框架。因为View不是双缓冲的所以需要创建一个图片然后使用这个图片的Canvas对象进行绘制,进行屏幕适应的时候在View的onDraw函数中将这张图片缩放到屏幕等大小,这样在任何屏幕下我们的画面都是全屏显示的,由于是在另外的线程中更新画面的,安卓不支持在非UI线程中更新画面,所以View提供了一个方法postInvalidate用于在非UI线程中更新画面。二、首先了解植物大战僵尸含有哪些元素,有道具,有阳光,有僵尸,有能种植植物的草坪,有植物。有子弹。我们这里只是进行设计简单的实现游戏,植物有单发射手,双发射手,寒冰射手,僵尸有普通僵尸,红帽僵尸,铁通僵尸。三、先设计最简单的阳光类Sun.java,阳光会从天空掉落和植物生成,从天空掉落的阳光会进行掉落运动,植物生成的阳光是禁止不动的,所以阳光有一个isStatic是否静止不动的布尔型标识,然后阳光在不是禁止不动的时候y坐标要增加就是下落,然后停止。所以在构造函数中随机一个目标y值,阳光非禁止不动状态下y坐标不断增加,当到达目标y值时候就把状态更改为禁止不动,其次阳光有一个消失标识,采用Vector动态数组存储阳光对象,绘制时候绘制该动态数组的所有阳光对象,如果该阳光的消亡标识为真就把该阳光从容器里面进行移除,阳光的消亡标识有两种情况下变成真,一是用户点击,二是到了一定时间消亡标识为真,所以阳光有一个计数器变量count,然后不断的自加,当到达阳光的消亡时间就让消亡标识为真,其次是用户点击了阳光,判断用户点到了阳光可以使用java中的Rect对象的contains方法判断点在矩形范围内,用户点击屏幕触摸坐标在阳光的矩形范围就让消亡标识为真。绘制的时候阳光要不断旋转,声明一个角度变量angle不断自加然后以阳光的中心点为旋转中心旋转阳光即可。四、接着我们设计一个草坪类Grass.java,草坪类的作用是用来种植植物,总共有5x9块草坪,横9竖5总共45块草坪,草坪的属性相对较于简单,就有一个是否可种植植物的布尔型标识,有植物在这块草坪上就不能进行植物种植了,所以声明一个5x9的二维草坪数组,然后把草坪坐标宽高传进去,其次草坪要有一个编号用来传递给植物用于植物铲除索引出该草坪改变它的是否可种植植物标识,草坪的编号对应0到44,草坪的绘制方法用草坪的编号值%2除以2的余数如果是0就绘制蓝色草坪否则绘制绿色草坪,这里我就是直接绘制一个矩形,然后在View的绘制函数中for循环绘制所有草坪这样我们就可以看到蓝绿相间的草坪了,当然草坪的触摸方法还没写先写好其他类再接着写。五、设计好了草坪我们设计一个僵尸类激angshi.java,僵尸有一个整形变量type代表僵尸的类型,0代表普通僵尸,1代表红帽僵尸,2代表铁桶僵尸,其次僵尸有一个整形变量hp代表僵尸的血量,然后有一个isMove布尔型标识表示僵尸是否可移动,僵尸在碰到植物的时候让僵尸停止移动即正在吃食物,僵尸与植物的碰撞检测可用矩形碰撞检测,java的Rect对象有一个intersect方法用来判断两个矩形是否交合用于矩形碰撞检测。另外还有个是否被寒冰子弹击中布尔型属性,如果是被寒冰子弹击中移动速度减半,僵尸的移动就是x坐标减去一个速度值即可即向左边移动,依旧使用一个Vector容器来进行存储僵尸,如果僵尸血量为0就从该容器移除僵尸,创建僵尸的时候可以使用一个固定二维数组,如下边所示intLEVELS[][]={{0},{0,0},{0,0,1},{0,1,1},{0,1,2},{2,2,1,1,0,0},{0,0,0,0,0,1,1,1,1,2},{0,0,0,0,0,1,0,0,0,2,2,2,2,1,1},{0,0,0,0,1,1,2,2,2,2,2,1,1,1},{0,1,2,0,1,2,0,1,2,0,2,2,1,1,0,2}};这是一个二维数组,第一维长度为10代表10波僵尸第二维表示要创建的僵尸,0表示普通僵尸,1表示红帽僵尸,2表示铁桶僵尸,当到达一定的时间就循环该波数的数组长度创建僵尸,然后波数值增加,比如这里第一波是一个普通僵尸,第二波是两个普通僵尸,虽然僵尸数据是固定...