TankWar历程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
坦克大战的制作过程
1.制作一个800 *600的窗口。
2.监听程序(关闭窗口,不允许修改窗口大小)
3.画一个坦克(用圆来表示),但是画出来之后,坦克不动
4.让圆动起来很简单,只要改变圆心的位置即可,但是怎样做呢?
把位置设置成变量,同时每画一次变量变一次(①制作一个线程run方法重画②按键后响应。
对比之下应该选择线程:线程画的比较均匀;以后子弹的设计怎么办?)。
还存在问题,就是坦克运动时会出现迟钝现象,怎么办?
5.利用双缓冲,就是在画到屏幕之前,先画在虚拟的图片上,然后
一次性画到屏幕上。
同时利用代码重构的优点,把屏幕的宽度和高度设置成静态常量(大写)。
6.坦克移动,添加KeyListener.
7. 要是在游戏中添加100个坦克怎么办?于是想到面向对象的技术,创建一个Tank的类,各自有个的paint方法,键盘响应方法等等。
8. 设定移动的8个方向。
(用个枚举类表示方向,每当按下键时,应该是当前的键值(向上、下,左、右)为true,根据方向,写出一个move 方法,最后在paint里重画移动后的图像)。
9.这时按下某个键后,坦克会一直运动,不能停止,原因就是一旦按下某个键后,它变成true,所以停止不了。
应该写一个键盘弹起时的响应方法,使之变成false。
10.有个炮弹运动
11.根据坦克的方向打出炮弹(坦克打出炮弹,所以坦克中应该有个fire方法,返回类型为炮弹类)。
写一个按下某个键是,调用fire方法,但是Missile是在TankClient中声明的,要想调用它,不容易,于是要用(持有对象引用的方法)在Tank中添加TankClient的对象,最后使TankClient中的m就是fire出来的炮弹就可以了。
还有一个问题,就是子弹要从坦克的中间部位打出来,所以计算炮弹的位置。
12.还有问题,坦克静止时,炮弹不动,这是应该想到,炮弹应该追随炮筒的方向,于是,在Tank中添加一个炮筒方向的成员变量,炮筒用一根线段来表示,需要在坦克paint中画出此线。
然后,炮弹跟随着炮筒进行发射。
13.打完炮弹后,再按下ctrl时,炮弹又回到炮筒中,所以应该打出一系列炮弹,添加炮弹容器,每当按下ctrl时,添加一个炮弹。
14.炮弹不消失的问题;坦克出边界的问题。
给炮弹一个表示生命的live布尔变量,当炮弹移动到边外时,live为false,然后从容器中删除此炮弹。
15.现在还没有敌人,于是画一个敌人。
(根据好坏之分设置一个布尔类型的good,根据好坏变换颜色,更换Tank的构造函数)。
16.将敌人击毙。
子弹打出是否击毙敌人。
所以在炮弹类中添加一个方法,hitTank();传递的参数就是Tank,返回值就是布尔类型的怎么判断击中,利用矩形的碰撞原理,每个炮弹和坦克类中添加一个getRect()方法,返回它外边的矩形,在利用矩形的intersects方法;当击中坦克时,应该让敌人死去,所以给坦克设置一个live变量,表
示是否存活,一旦击中,变为false,在Tank的draw中画坦克时。
先判断live是否为真,真的才画出来。
同时,击中后,炮弹也要消失,所以也删除炮弹(还有就是,加一个条件,坦克是否还存活吗?)17.添加爆炸效果。
做成对象,用圆有小变大在变小。
最后,应该是在hitTank时,产生一个爆炸效果。
同时,不止一个爆炸效果,再添加一个容器,添加以及删除参照以上的写法。
18.添加多个坦克,应用容器。
注意初始化是在框架出现前就出现敌人。
19.让敌人的坦克动起来(人工智能)
20.出现墙,子弹打上消失,坦克不能穿越
21.坦克之间不能相互穿越
22. 超级炮弹,按下A从八个方向打出炮弹
23.主战坦克的生命值(life)
24.图形化代表主战坦克的生命值
25.添加血块类(吃了之后能够长血)
26.敌人死后添加几个敌人,我军死后,按F2再添加一个我军坦克。