java吧 关注:1,235,027贴子:12,701,664
  • 13回复贴,共1

开发安卓游戏植物大战僵尸我的思路

取消只看楼主收藏回复

实现植物大战僵尸这个游戏相对来说非常简单,我介绍一下我的思路。新人发帖,望吧主加精。首先游戏设计,由于植物大战僵尸是2d游戏,最多算2.5d所以使用安卓的View完全足够。View有两个重点方法onDraw用于绘制,onTouchEvent用户触摸屏幕执行用来和用户交互。在构造函数进行相关初始化以后然后启动一个线程不断的循环执行绘图与逻辑函数这样就是一个简单的游戏框架。因为View不是双缓冲的所以需要创建一个图片然后使用这个图片的Canvas对象进行绘制,进行屏幕适应的时候在View的onDraw函数中将这张图片缩放到屏幕等大小,这样在任何屏幕下我们的画面都是全屏显示的,由于是在另外的线程中更新画面的,安卓不支持在非UI线程中更新画面,所以View提供了一个方法postInvalidate用于在非UI线程中更新画面。


IP属地:广东来自手机贴吧1楼2014-10-23 08:01回复
    首先了解植物大战僵尸含有哪些元素,有道具,有阳光,有僵尸,有能种植植物的草坪,有植物。有子弹。我们这里只是进行设计简单的实现游戏,植物有单发射手,双发射手,寒冰射手,僵尸有普通僵尸,红帽僵尸,铁通僵尸。


    IP属地:广东来自手机贴吧2楼2014-10-23 08:02
    收起回复
      先设计最简单的阳光类Sun.java,阳光会从天空掉落和植物生成,从天空掉落的阳光会进行掉落运动,植物生成的阳光是禁止不动的,所以阳光有一个isStatic是否静止不动的布尔型标识,然后阳光在不是禁止不动的时候y坐标要增加就是下落,然后停止。所以在构造函数中随机一个目标y值,阳光非禁止不动状态下y坐标不断增加,当到达目标y值时候就把状态更改为禁止不动,其次阳光有一个消失标识,采用Vector动态数组存储阳光对象,绘制时候绘制该动态数组的所有阳光对象,如果该阳光的消亡标识为真就把该阳光从容器里面进行移除,阳光的消亡标识有两种情况下变成真,一是用户点击,二是到了一定时间消亡标识为真,所以阳光有一个计数器变量count,然后不断的自加,当到达阳光的消亡时间就让消亡标识为真,其次是用户点击了阳光,判断用户点到了阳光可以使用java中的Rect对象的contains方法判断点在矩形范围内,用户点击屏幕触摸坐标在阳光的矩形范围就让消亡标识为真。绘制的时候阳光要不断旋转,声明一个角度变量angle不断自加然后以阳光的中心点为旋转中心旋转阳光即可。


      IP属地:广东来自手机贴吧3楼2014-10-23 08:02
      收起回复
        接着我们设计一个草坪类Grass.java,草坪类的作用是用来种植植物,总共有5x9块草坪,横9竖5总共45块草坪,草坪的属性相对较于简单,就有一个是否可种植植物的布尔型标识,有植物在这块草坪上就不能进行植物种植了,所以声明一个5x9的二维草坪数组,然后把草坪坐标宽高传进去,其次草坪要有一个编号用来传递给植物用于植物铲除索引出该草坪改变它的是否可种植植物标识,草坪的编号对应0到44,草坪的绘制方法用草坪的编号值%2除以2的余数如果是0就绘制蓝色草坪否则绘制绿色草坪,这里我就是直接绘制一个矩形,然后在View的绘制函数中for循环绘制所有草坪这样我们就可以看到蓝绿相间的草坪了,当然草坪的触摸方法还没写先写好其他类再接着写。


        IP属地:广东来自手机贴吧4楼2014-10-23 08:03
        收起回复
          设计好了草坪我们设计一个僵尸类Jiangshi.java,僵尸有一个整形变量type代表僵尸的类型,0代表普通僵尸,1代表红帽僵尸,2代表铁桶僵尸,其次僵尸有一个整形变量hp代表僵尸的血量,然后有一个isMove布尔型标识表示僵尸是否可移动,僵尸在碰到植物的时候让僵尸停止移动即正在吃食物,僵尸与植物的碰撞检测可用矩形碰撞检测,java的Rect对象有一个intersect方法用来判断两个矩形是否交合用于矩形碰撞检测。另外还有个是否被寒冰子弹击中布尔型属性,如果是被寒冰子弹击中移动速度减半,僵尸的移动就是x坐标减去一个速度值即可即向左边移动,依旧使用一个Vector容器来进行存储僵尸,如果僵尸血量为0就从该容器移除僵尸,创建僵尸的时候可以使用一个固定二维数组,如下边所示 int LEVELS[][]={{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表示铁桶僵尸,当到达一定的时间就循环该波数的数组长度创建僵尸,然后波数值增加,比如这里第一波是一个普通僵尸,第二波是两个普通僵尸,虽然僵尸数据是固定的,但是对僵尸出现的位置也要进行一下随机。其次可使用波数值作为关卡进度值在底部绘制一个进度条,另外僵尸有一个整形变量列属性,取值范围在0到4总共五列,表示僵尸在哪一列,其作用是用于绘制僵尸时候按顺序绘制,由远到近的先后顺序绘制。否则你可能看到第一列的僵尸的脚在第二列僵尸的脑袋上面。僵尸的绘制我是用一个三维的图片数组,第一维表示僵尸是否被寒冰子弹击中,第二维表示僵尸的种类,第3维是僵尸的移动动画,其中被寒冰子弹击中的图片我是通过像素操作for循环图片的宽高如果该像素不是透明色填充像素为蓝色得到一个被寒冰子弹击中的僵尸图片。


          IP属地:广东来自手机贴吧5楼2014-10-23 08:03
          收起回复
            然后设计子弹类Zidan.java,子弹依旧有一个整型变量type表示子弹的类型,0表示普通子弹,1表示寒冰子弹,跟僵尸一样采用Vector存储子弹对象,依旧有一个是否消失的标识,当子弹碰撞到僵尸后或者子弹的x坐标大于屏幕右边就让消失标识为真从容器里面移除子弹,子弹的移动就是x坐标增加一个速度往右边移动。子弹同僵尸一样有一个列属性表示该子弹在哪一列,因为有些子弹比如玉米投手做抛物线运动y坐标会运动到它上面所在的一列,所以子弹与僵尸的列属性相等的碰撞才视为有效碰撞,碰撞以后取出该子弹类型不同的类型对僵尸造成不同的伤害。


            IP属地:广东来自手机贴吧7楼2014-10-23 08:22
            收起回复
              设计道具类Daoju.java,道具依旧有一个整形变量type表示道具的类型,0代表铁铲,1代表向日葵,2代表单发豌豆射手,3代表双发豌豆射手,4代表寒冰射手,道具有一个isSelect是否被选中的布尔型属性,如果被选中就在该区间绘制一个红色的边框,除此道具有一个布尔型变量是否冷却状态,表示该道具是否在冷却中,如果在冷却中该道具不可使用,另外还需有一个计时器count,如果在冷却状态不断自加,当达到了该道具的冷却时间以后把该道具的冷却状态改为假。如果为冷却状态就绘制一个半透明灰色矩形以count作为进度值绘制在道具上面。用一个整形变量表示使用该道具所要消耗的阳光,不同的道具消耗不同的阳光值。依旧使用一个Vector容器来存储道具对象。


              IP属地:广东来自手机贴吧9楼2014-10-23 08:41
              回复
                上一个成品图吧


                IP属地:广东来自手机贴吧10楼2014-10-23 08:51
                收起回复
                  设计植物类Zhiwu.java,植物也有一个类型type,如果为0代表向日葵,1代表单发豌豆射手,2代表双发豌豆射手,3代表寒冰射手,也使用一个Vector存储植物对象,植物也有一个hp表示植物的血量,不同类型的植物有不同的血量,植物有一个编号标识表示是在哪块草坪上,当植物hp为0或者铲除植物时候从Vector进行移除该植物,并获取该植物编号所对应的草坪设置可种植状态为真,植物的逻辑处理在不同类型处理不同的逻辑,在阳光状态每隔一定时间从阳光容器里面进行添加阳光对象,如果是单发子弹就从子弹容器添加一个子弹对象,如果是双发射手就添加两个子弹对象,可以发子弹的植物需要封装一个是否可发射子弹的方法,每次都让可发射子弹的标识为假,当有僵尸出现在植物的攻击范围就是矩形碰撞检测就让发射子弹标识为真,如果为真才从容器添加子弹。


                  IP属地:广东来自手机贴吧13楼2014-10-23 09:48
                  回复
                    这个是我写的简易版植物大战僵尸,去掉里面的中文,要素材可以直接解压apk得到:htt进行了p://p修改an.baid修复u.com/sha了一些re/link?sh问题areid=257可玩性3885251&uk提高=1028321203


                    IP属地:广东来自手机贴吧15楼2014-10-23 09:59
                    收起回复
                      @SYQSYQQQ @windsun_ul @神宫寺铃香 能加精吗?


                      IP属地:广东来自手机贴吧18楼2014-10-23 10:14
                      回复
                        秒沉了


                        IP属地:广东来自手机贴吧20楼2014-10-23 11:10
                        回复
                          自顶


                          IP属地:广东来自手机贴吧23楼2014-10-23 11:51
                          回复
                            之前我还发了一篇消灭星星和泡泡龙实现思路的帖子:http://tieba.baidu.com/p/3291644414?fr=wap&tb_device=pc&ie=utf-8


                            IP属地:广东来自手机贴吧35楼2014-10-24 17:01
                            回复