Java坦克大战Summary

(由于作者本人水平有限,如有错误还请大家指出)

  1. 画我方坦克 :JFrame是画框,Panel是画板,paint(Graphics g)是画笔。

    • JFrame中设置的大小是包括画板和窗口共同的大小

    • TankGame的构造器中初始化MyPanel,MyPanel的构造器中初始化Hero,一环扣一环

    • 何时调用paint方法:

      1. 组件第一次在屏幕上显示时程序自动调用

      2. repaint方法被调用

      3. 窗口大小发生变化

  2. 按键控制我方坦克移动:Java 的事件控---委派时间模型

    • 按键移动即改变方向加坐标改变

  3. 画出敌人坦克:用Vector保存(多个,有各自生命周期)

  4. 按下J键 我方发射子弹:由于子弹有各自生命周期,每发射一颗子弹就是一个线程。shot类相当于线程数据源,由hero调用线程并发射,在MyPanel判断是否要发射。

    由于hreo可以发射子弹 故画板上应画出子弹动态射击效果,所以应不停重绘面板---run方法可实现循环的效果---故把MyPanel做成一个线程---在TankGame的构造器中启动。

    • run方法可实现循环的效果

    • 线程的使用,一般也要注意该何时终止(这个项目中重绘却不用终止)

  5. 敌方坦克也能发射子弹:给每个敌方坦克配备多颗子弹,用Vector保存。子弹和坦克共存亡,初始化敌方坦克时也初始化子弹,画敌方坦克时也画子弹。【可优化的是,就算坦克消亡,子弹仍可飞完剩下的路程】

  6. 我方子弹击中敌方坦克时 敌方坦克和我方子弹消失,能做出爆炸效果更好:何为被击中---我方子弹在敌方坦克区域内,由于这个方法会改变显示的效果---把这个方法放在run方法中调用,判断是否有被击中的,则遍历敌方坦克 一个一个判断。

    做出爆炸效果:爆炸效果即为三张图片切换九次,定义Bomb类确定爆炸的位置 并用“生命值”控制图片的切换以做出更好的爆炸效果。在坦克被击中处设置一颗炸弹 放入炸弹集合,并在重绘面板时画出来

    • 为什么用Vector存放炸弹,而不是让炸弹一颗一颗的存在---防止同时射中多个坦克,因为用炸弹集合就是 击中一个坦克就放一颗炸弹到炸弹集合 然后画的时候再依次取出画

    • 敌方坦克被击中不仅要把生命值设为false,还要从坦克集合中移除,不然坦克还在那儿 只是没画出来

    • 每变化一些功能,就要看画出来的效果有什么变化,即paint方法中的变化

    • 怎样考虑将一个变量设置为全局还是局部:由于一个类中多个方法都要用到该变量 则设置为全局变量

  7. 敌方坦克自由移动:由于要能不停移动---做成线程,即Enemy继承Runnable,并在run方法中让坦克移动。在初始化敌方坦克时启动线程

  8. 控制坦克移动范围:在移动的时候 判断下一步还能移动吗,直接在Tank父类中根据移动方向的不同控制

  9. 我方坦克发射的子弹消亡后才能再发子弹:按下J键时判断 有无子弹存在(第一次发射)、子弹是否销毁

  10. 我方坦克最多同时发射规定颗子弹:由于是多颗故放在集合中,创建一颗就放在集合中,满个数就不创建了,在按下J键时调用则无需判断了因为方法本身就判断了

    • 由于有多颗子弹了,所以判断是否击中敌方坦克的方法要变,即要依次取出我方子弹了

    • 一个方法的变化,要考虑其他地方是否也要变---牵一发而动全身

  11. 敌方发射的子弹消亡后才能再发射:由于敌方坦克配备的是子弹集合,而且是在Enemy的run中不停发射子弹,故而在发射时判断Enemy子弹集合中子弹的个数是否为零(为零就说明子弹被销毁了),为零就再创建一颗放入集合然后发射

  12. 敌方可同时发射规定颗:只需再上述判断改为判断子弹集合中子弹的个数是否少于规定 个数

  13. 敌方子弹击中我方坦克,消失和爆炸效果:和击中敌方坦克的判断类似,取出敌方子弹,取出我方坦克,判断是否在我方坦克区域

  14. 防止敌方坦克重叠:将敌人坦克从集合中依次取出,判断是否在其他坦克范围内,故要在Enemy中定义坦克集合,并且要把MyPanel中真正的enemies设置到Enemy类(即setEnemies方法)。判断重叠与否,根据要判断的坦克的方向分成四大类,再根据用来判断的坦克分为八类。如果重叠了,则不能move~了

    • 再MyPanel中把集合设置到Enemy类中,不然有越界的异常

  15. 记录玩家总成绩(击中的敌方坦克总数),存盘退出:首先在MyPanel中添加一个画出记录总成绩的区域,在paint中调用。创建类记录成绩,在击中敌方坦克时增加成绩;能存盘退出,IO流,关闭窗口时调用

    • 记录的路径跟着工程走,就在src里创建文件

    • 关闭窗口时调用,addWindowListener

  16. 记录退出游戏时敌人坦克的坐标和方向,存盘退出:关闭窗口时调用的方法中再加上敌人坦克的坐标和方向即可

    • 在Recorder中创建敌人坦克集合,仍像Enemy那样处理

  17. 玩游戏时 可以选择新开游戏还是继续上一局:要能继续上一局,则需从文件中读取数据---将文件的数据恢复成Node结点集合,再根据结点恢复坦克(这些数据主要是初始化坦克时确定坐标和方向)。在游戏开始时能根据玩家选择开始游戏,故而创建一个菜单

    • 在Recorder中创建Node集合,存放数据,在初始化的时候就用这里面的数据,就可以恢复敌方坦克的状态【这儿不能恢复我方坦克的状态】

    • 菜单写在很多位置都可以,写在TankGame的构造器,可能是因为 在选择游戏模式后才会画出面板,故而写在TankGame挺好;加载面板等一系列操作写在构造器而不是主方法,主要是体现封装吧

    • "\r\n" 和 newLine() 都可换行

    • readLine 读取一行内容(返回字符串),但是没有换行,所以需要的话 要自己插入一个换行

    • 字符串转int:Integer.parseInt(String)、 Integer.valueOf(String)

      valueOf(String)方法会返回Integer类的对象,而parseInt(String)方法返回原始的int值

    • 字符串分成几个数据:字符串分割成数组,再根据索引获取

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值