最近复习了一下刚学习J2SE后,跟着马士兵老师学习的这个项目--坦克大战;
首先,写一个项目需要注意需求分析:
1.能够四处移动;
2.能够打击敌人;
3.敌人能够移动;
4.能够产生爆炸;
5.能够产生障碍;
6.能够增长生命;
其次,写项目不是一蹴而就的,先从最基础的功能实现,然后不断的往上面加东西,注意保存版本。
下面对这个项目进行一个小结:
0.1 产生一个窗口:这个是通过继承类Frame就可以轻易的实现,不赘述;
0.2 窗口关闭事件:通过内部类来实现;
0.3 画出代表坦克的实心圆:通过paint方法实现---
public void paint(Graphics g){
Color c = g,getColor();
g.setColor(Color.RED);
g.fillOval(50,50,30,30);
g.setColor(c);
}
注意事项有两个:一、paint方法不需要显示的调用,在窗口重画的时候自动调用;
二、paint方法编写的时候,不要改变原来的前景色,先取出来,用完之后再恢复;
0.4 让坦克动起来:启动线程不断重画;线程建为内部类,好处:
可以方便的访问包装类的方法。不方便公开的,只为包装类服务。
0.4.1 使用双缓冲消除闪烁现象: 解决办法:将所有的东西画在一副虚拟的图片上,一次性的显示出来;
每一次调用repaint方法,先调用update方法再调用,因此,在调用paint方法之前,我们重写update方法。
0.5 代码重构:
将需要多处改变的量定义为常量,如本文中的Frame宽度和高度;定义常量的方式:public static final int ;
0.6 让坦克听从我们键盘的指挥: 需要增加键盘监听器类 KeyMonitior; 同时注意switch .... case ... 语句中 break语句的使用;
0.7 将坦克独立的包装成类:步骤:建立Tank类;为坦克类添加成员变量x,y;添加draw 方法,使Tank类独立的控制自己的画法;
添加Tank类处理按键的方法;根据Tank类修改TankClient;
0.8 让主战坦克向8个方向移动: 步骤: 添加按键状态的boolean; 添加代表方向的量(使用枚举);根据按键状态确定Tank方向;根据方向进行下一步移动(move方法);
0.9 修改上一个版本的bug : 步骤: 处理抬起键的问题;修改TankClient的相关代码;
1.0 添加子弹类 : 步骤 : 添加x,y,dir等属性;添加构造方法、draw等必要方法;根据不同的方向,进行不同的运动;在TankClient中模拟一颗子弹;
1.1 根据主战坦克的方向和位置,打出子弹: 步骤: 增加Ctrl键的按键处理;由于是坦克打出子弹,所以坦克中fire方法的返回值是Missile;
根据坦克的方向和位置设定子弹的方向和位置并new 出来,然后返回(fire方法的实现);
1.2 解决坦克停下来也能打出炮弹的问题--画出炮筒 步骤: Tank类新增属性ptDir ; 每次move 后根据坦克的新方向确定炮筒的方向;将炮筒用直线的方式表现出来;
1.3 能打出多发炮弹 步骤: 使用容器装炮弹; 每当抬起Ctrl键的时候就往容器中装入新的炮弹;逐一画出每一发炮弹;
1.4 解决炮弹不消亡的问题 : 步骤 : 加入控制炮弹生死的量bLive(Missile); 当炮弹已经死去就不需要对其重画; 当炮弹飞出边界就死亡; 当炮弹死亡就从容器中去除;
1.5 画一辆敌人的坦克 : 步骤: 加入区别敌我的量good;根据敌我的不同设置不同颜色;更新Tank的构造函数,加入good;TankClient中new出敌人的坦克并画出;
1.6 将敌人坦克击毙: 步骤 : Missile中加入hitTank(Tank)方法,返回布尔类型;碰撞检测的辅助类Rectangle,使用这个方法,可以正好拿到包在坦克外的方块;
为Tank和Missile都加入getRect方法;当击中敌人坦克时,敌人被打死,子弹也死去;
增加控制Tank生死的量live,当打中的时候设置为false,Tank的draw方法里,先判断live的量,如果false的话就不画了;
1.7 加入爆炸: 步骤: 用不同直径的圆模拟爆炸;加入live;加入位置属性;加入draw方法;
1.8 添加多辆坦克 :步骤 : 用容器来装敌人的Tank; 向容器中装入多辆敌人Tank; 画出来; 添加hitTanks方法打击多辆Tank;
1.9 让敌军更加智能: 步骤:敌军坦克动起来;让敌军坦克向随机的方向移动; 让敌军坦克可以发射炮弹;敌军的炮火不能太猛烈;
2.0 添加两堵墙 : 步骤 : 建立Wall类,画出来; 让每颗子弹打击墙,添加hitWall方法;让坦克不能穿越墙;
2.1 坦克不能互相穿越 步骤 : 当坦克撞到坦克时stay;在Tank类中增加collidesWithTanks; 在TankClient的paint方法中new出坦克的时候,加入collideWithWall;
2.2 超级炮弹 步骤:处理按键A;
2.3 主战坦克的生命值 步骤: 加入life变量; 在窗口显示生命值;
2.4 图形化主战坦克的生命值: 根据不同的life进行不同的显示;在Tank类中加入内部类BloodBar(血条);
2.5 添加血块: 步骤 :添加blood类;添加必要的方法,并且让blood对象固定轨迹运动;
2.6 最后的修正 : 敌人死光了重新加入; 我军挂掉按F2加入;
还有图片版和网络版,留到下回分析。