(由于作者本人水平有限,如有错误还请大家指出)
-
画我方坦克 :JFrame是画框,Panel是画板,paint(Graphics g)是画笔。
-
JFrame中设置的大小是包括画板和窗口共同的大小
-
TankGame的构造器中初始化MyPanel,MyPanel的构造器中初始化Hero,一环扣一环
-
何时调用paint方法:
-
组件第一次在屏幕上显示时程序自动调用
-
repaint方法被调用
-
窗口大小发生变化
-
-
-
按键控制我方坦克移动:Java 的事件控---委派时间模型
-
按键移动即改变方向加坐标改变
-
-
画出敌人坦克:用Vector保存(多个,有各自生命周期)
-
按下J键 我方发射子弹:由于子弹有各自生命周期,每发射一颗子弹就是一个线程。shot类相当于线程数据源,由hero调用线程并发射,在MyPanel判断是否要发射。
由于hreo可以发射子弹 故画板上应画出子弹动态射击效果,所以应不停重绘面板---run方法可实现循环的效果---故把MyPanel做成一个线程---在TankGame的构造器中启动。
-
run方法可实现循环的效果
-
线程的使用,一般也要注意该何时终止(这个项目中重绘却不用终止)
-
-
敌方坦克也能发射子弹:给每个敌方坦克配备多颗子弹,用Vector保存。子弹和坦克共存亡,初始化敌方坦克时也初始化子弹,画敌方坦克时也画子弹。【可优化的是,就算坦克消亡,子弹仍可飞完剩下的路程】
-
我方子弹击中敌方坦克时 敌方坦克和我方子弹消失,能做出爆炸效果更好:何为被击中---我方子弹在敌方坦克区域内,由于这个方法会改变显示的效果---把这个方法放在run方法中调用,判断是否有被击中的,则遍历敌方坦克 一个一个判断。
做出爆炸效果:爆炸效果即为三张图片切换九次,定义Bomb类确定爆炸的位置 并用“生命值”控制图片的切换以做出更好的爆炸效果。在坦克被击中处设置一颗炸弹 放入炸弹集合,并在重绘面板时画出来
-
为什么用Vector存放炸弹,而不是让炸弹一颗一颗的存在---防止同时射中多个坦克,因为用炸弹集合就是 击中一个坦克就放一颗炸弹到炸弹集合 然后画的时候再依次取出画
-
敌方坦克被击中不仅要把生命值设为false,还要从坦克集合中移除,不然坦克还在那儿 只是没画出来
-
每变化一些功能,就要看画出来的效果有什么变化,即paint方法中的变化
-
怎样考虑将一个变量设置为全局还是局部:由于一个类中多个方法都要用到该变量 则设置为全局变量
-
-
敌方坦克自由移动:由于要能不停移动---做成线程,即Enemy继承Runnable,并在run方法中让坦克移动。在初始化敌方坦克时启动线程
-
控制坦克移动范围:在移动的时候 判断下一步还能移动吗,直接在Tank父类中根据移动方向的不同控制
-
我方坦克发射的子弹消亡后才能再发子弹:按下J键时判断 有无子弹存在(第一次发射)、子弹是否销毁
-
我方坦克最多同时发射规定颗子弹:由于是多颗故放在集合中,创建一颗就放在集合中,满个数就不创建了,在按下J键时调用则无需判断了因为方法本身就判断了
-
由于有多颗子弹了,所以判断是否击中敌方坦克的方法要变,即要依次取出我方子弹了
-
一个方法的变化,要考虑其他地方是否也要变---牵一发而动全身
-
-
敌方发射的子弹消亡后才能再发射:由于敌方坦克配备的是子弹集合,而且是在Enemy的run中不停发射子弹,故而在发射时判断Enemy子弹集合中子弹的个数是否为零(为零就说明子弹被销毁了),为零就再创建一颗放入集合然后发射
-
敌方可同时发射规定颗:只需再上述判断改为判断子弹集合中子弹的个数是否少于规定 个数
-
敌方子弹击中我方坦克,消失和爆炸效果:和击中敌方坦克的判断类似,取出敌方子弹,取出我方坦克,判断是否在我方坦克区域
-
防止敌方坦克重叠:将敌人坦克从集合中依次取出,判断是否在其他坦克范围内,故要在Enemy中定义坦克集合,并且要把MyPanel中真正的enemies设置到Enemy类(即setEnemies方法)。判断重叠与否,根据要判断的坦克的方向分成四大类,再根据用来判断的坦克分为八类。如果重叠了,则不能move~了
-
再MyPanel中把集合设置到Enemy类中,不然有越界的异常
-
-
记录玩家总成绩(击中的敌方坦克总数),存盘退出:首先在MyPanel中添加一个画出记录总成绩的区域,在paint中调用。创建类记录成绩,在击中敌方坦克时增加成绩;能存盘退出,IO流,关闭窗口时调用
-
记录的路径跟着工程走,就在src里创建文件
-
关闭窗口时调用,addWindowListener
-
-
记录退出游戏时敌人坦克的坐标和方向,存盘退出:关闭窗口时调用的方法中再加上敌人坦克的坐标和方向即可
-
在Recorder中创建敌人坦克集合,仍像Enemy那样处理
-
-
玩游戏时 可以选择新开游戏还是继续上一局:要能继续上一局,则需从文件中读取数据---将文件的数据恢复成Node结点集合,再根据结点恢复坦克(这些数据主要是初始化坦克时确定坐标和方向)。在游戏开始时能根据玩家选择开始游戏,故而创建一个菜单
-
在Recorder中创建Node集合,存放数据,在初始化的时候就用这里面的数据,就可以恢复敌方坦克的状态【这儿不能恢复我方坦克的状态】
-
菜单写在很多位置都可以,写在TankGame的构造器,可能是因为 在选择游戏模式后才会画出面板,故而写在TankGame挺好;加载面板等一系列操作写在构造器而不是主方法,主要是体现封装吧
-
"\r\n" 和 newLine() 都可换行
-
readLine 读取一行内容(返回字符串),但是没有换行,所以需要的话 要自己插入一个换行
-
字符串转int:Integer.parseInt(String)、 Integer.valueOf(String)
valueOf(String)方法会返回Integer类的对象,而parseInt(String)方法返回原始的int值
-
字符串分成几个数据:字符串分割成数组,再根据索引获取
-