坦克大战项目开发流程、问题和介绍
来源:互联网 发布:八王之乱 知乎 编辑:程序博客网 时间:2024/05/18 00:58
1. 建立一个无返回值的lauchFrame()方法来完成画框架
框架 800*600
颜色 lightGray 浅灰色
不可以改变大小
初始化显示位置 调用Component里面的setLocation(x,y);
2. 通过paint(Graphics g)来画出圆。
调用g.fillOvar(x,x,width,height);
3. 通过双缓冲技术来实现坦克画面动起来不流畅的感觉
坦克动起来,采用线程技术(线程用内部类表示),每间隔50MS重画一次画面, 重画 采用repaint();
调用update(Graphics g)
1. 画一个800,600的iamge
2. 在图片上面画一个跟主窗体一样大方形
3. 调用paint(Graphics g)来画坦克(也就是圆)
注意: 在IMAGE上面画方块的时候一定要和主体窗口一样大,要不回出现画一长条粗线的状况。
技巧: 把所有数字都用变量代替,修改起来方便
4. 定义接收键盘的内部类
KeyMonitor extends KeyAdapter
5. 定义坦克自己的类,并且定义自己接收键盘按下事件。
6. 如何让坦克朝八个方向走
1. 把每一个按下事件用一个BOOLEAN值记录下来,当按下是就把值设置为TRUE,否则FALSE;
2. 在定义一个枚举enum设置八个值记录下八个方向,再用switch来确定该往那里走。
3. 利用switch来确定enum中的哪个方向,
当按下的时候把值设置为true当键盘弹起是把值设为false;
7. 画出子弹,运用面向对象思维,定义一个子弹类,
通过坦克的方向来确定子弹的方向,定义一个move方法来接收移动参数。
定义一个容器保存子弹,按下CTRL时加入子弹,当子弹出界的时候就在容器里面移除删除。
8. 坦克被打中时消失。
给子弹和坦克定义一个Rectangle返回值的方法, 在子弹类里面检测两个方法是否有接触。
当接触了后就把坏坦克从坏坦克容器里面移除。
在坦克里面定义一个boolean值代表坦克是否活着,当坦克活着的时候值为true;当坦克死了之后值为false;
注意: 机器坦克在Rectangle返回值的方法里传入的是机器坦克容器,
主战坦克在Rectangle返回值的方法里传入的是主战坦克引用
9. 坦克死掉后子弹也死亡。
为子弹设置一个boolean值代表子弹的死活,当子弹活着时为true;子弹死了后值为false;
10. 坦克死掉后有爆炸产生,定义一个爆炸类在类。
难点, 爆炸需要在子弹与坦克相撞的地方发生,
在tankClient里面定义一个装爆炸的容器,采用ArrayList 和 LinkedList在这里的效果差不多。
在子弹类里面的getRect()方法里面调用爆炸类容器没相交一次就往里加一个爆炸,接着在tankClient里面画出来。位置就是坦克和子弹相交的地方。
11. 坦克 和子弹 不能跑出屏幕
当子弹跑出屏幕的时候让它消亡
当坦克跑出屏幕的时候要它呆在屏幕边缘不给出去,
坦克具体做法, 当坦克小于边缘坐标时让坦克等于边缘坐标,当坦克大于边缘坐标时,让它等于边缘坐标。
12. 机器坦克发射也发射子弹,并且子弹不会伤到自己方。
在创建子弹时指定好坏蛋,在子弹构造方法里面加入,
当坏子弹碰到坏坦克时在子弹里面的hitTanks(List<Tank> tank)里面加入一个判断,判断是否是友方发出的如果是,就不死亡,反之。
13。 出现问题 注意:
1.当坦克死亡之后,坦克还可以发射子弹。
在坦克里面的fire方法中加入 当坦克死亡时返回null,而不是继续往里加子弹
2. 当坦克死亡后,机器坦克打坦克死亡的地方时,还是会出现爆炸,这是由于在Missile类里面没有判断主战坦克死了以后该怎么处理,在判断语句里面加上一句当坦克死亡的时候不能产生爆炸。
14. 给当前游戏添加一堵不可穿越的墙壁,
墙也是一个对象,把墙单独设置成为一个类。 在墙里面也设置一个碰撞类, 在坦克类里面调用, 用两个变量记录前一个X,Y的值,当坦克碰到墙壁时,把坦克的X,Y值赋值为前一个X,Y的值。
随机生成墙壁:在墙壁里面建立一个方法,方法里面定义一个随机for循环的随机数,再在for循环里面,加入随机生成的X,Y值和width,height值,横墙和竖墙通过两个for循环来确定。再加入个一个List当中。
15. 坦克不能互相穿越,
在坦克里面设置一个碰撞类穿入敌人所有坦克,也就是list数组,一个一个遍历,当坦克不是当前坦克时就检测是否发生碰撞,如果发生碰撞了,就stay()到前一个X,Y位置。
16. 给当前坦克设置一个超级炮弹 可以八方向发射子弹,
首先考虑子弹是由什么控制发出来的,
根据子弹的方向是由坦克的方向确定这个前提,可以在tank类里面设立另一个发射子弹的方法,把坦克8个方向一次都传进去,先把妹举enum转化为数组
在做一个for循环把每一个方向都循环完。 这样就可以实现一次朝八个方向发射了,
假如我想从四方向发射呢?
你可以做一个判断语句,只有是前后左右才可以进行发射,就可以了
17. 给当前坦克做一个生命值,
生命值,可以左一个变量,每当坦克中一枪的时候变量减少 ,当变量等于0是,坦克死亡。
把生命值可视画;另外定义一个血条类,血条类的方块长短根据血的变量来确定。
18. 给坦克添加一个坦克吃了可以加血的浮动的方块
给该对象添加一个类,有一个返回值为Rectangle的方法。 当坦克碰到的时候生命值赋值为最高。
难点: 加血类的浮动和不定时出现在不定点的位置,
浮动, 给该类添加一个Random产生的随机大小的数组,在该类draw(Graphics g)类当中随机给随机数组添加随机数值。
不定时出现:给加血类添加是否活着属性,放坦克碰到时值为false 当值为false时直接把加血中的draw(Graphics g) 在画前返回,否则继续画 在坦克draw(Graphicsg)里面添加一个随机数,当这个随机数等于某数值时,把当前加血类设置为TRUE;
19. 当主战坦克死亡的时候按F2就重新复活,当敌方坦克死亡后,按Q就能增加数量。
键盘接受并且判断当按下F2的时候,把主战坦克设置为true并且吧生命值设为最大,
当按下Q时并且敌方坦克数量为0时在List容器中加入数量一定的坦克。
20. 优化,把敌方坦克移动速度和炮弹速度减慢,当敌方坦克增加到一定数量时游戏刷新加快,目的,加快移动速度。
敌方坦克移动速度和炮弹速度减慢根据好坏来判断。
刷新速度,在MAIN方法类里面,加快框架刷新速度。
21. 测试坦克大战.
22. 给坦克大战加注释。
23. 生成javadocs文档,生成jar文件。
总结,这个坦克大战程序,主要运用了,内部类,匿名内部类。线程,和持有对方引用和Properties读取等技术。整体复习了J2SE大部分内容。
其中出现的问题有:
1. 在两个类来回判断的逻辑当中脑袋逻辑有点混乱,浪费了很多时间来整理。
2. 在判断敌方坦克互相打中时会死亡, 原因是因为在子弹和坦克相撞的getRect()方法判断时调用参数是失误,本来是要调用坦克的好坏,结果错调用了子弹的好坏,而子弹的好坏也穿错了,子弹的好坏传的全部都是myTank主战坦克的子弹,所以敌方坦克一开炮,自己全死。
3. 在坦克死亡后还可以继续发射子弹,这是由于,当坦克死亡后,并没有给子弹传递一个信息说坦克死了。解决办法,在发射子弹的方法里面加入一个判断坦克是否活着的IF语句,如果死了,直接返回。
4. 在坦克死亡后,坦克死亡的位置,敌方坦克继续打那位置时还是会出现爆炸,原因,在Missile类里面的加入爆炸方法中,没有判断当坦克死亡后将不能进行爆炸,在Missile类里面加入坦克是否存活的一个判断。
5. 综上所述: 所有问题都是出于自己的粗心大意,以后要注意。
- 坦克大战项目开发流程、问题和介绍
- 坦克大战项目
- 坦克大战项目总结
- 坦克大战项目总结
- 坦克大战 项目总结
- Java开发坦克大战
- <坦克大战Java>开发中遇到的问题
- J2se小项目:坦克大战
- Unity3D项目之《坦克大战》
- Java项目--坦克大战1
- 项目:简单实现坦克大战
- C#开发-----坦克大战游戏
- HTML5 坦克大战 游戏开发
- Unity3D游戏引擎实战开发从入门到精通(坦克大战项目实战、NGUI开发、GameObject)
- Java项目实战:坦克大战(1)
- 小项目之坦克大战步骤
- 图片版坦克大战游戏项目说明
- 小项目の坦克大战游戏
- Social mark代码生成器
- 迭代器怎样返回(yield return)
- Selenium 自动化测试工具
- Visual Studio 2010及.NET框架4.0前景瞻望
- 我的系统托盘
- 坦克大战项目开发流程、问题和介绍
- 一段分页的代码
- CMWAP和CMNET的区别
- HLA安装与设置——汇编语言教程之《汇编语言编程艺术》
- 莱昂氏源代码的问题
- 动态ActionForm、struts上传文件、自定义ActionForm的类型转换、Struts对ActionForm的自动搜集流程
- 手把手教你用C#打包应用程序(安装程序)【卸载模块已添加】
- 无刷新联动菜单
- 死锁,死锁的四个必要条件以及处理策略