文章目录
- 1 绘制坦克
- 坦克
- 画板Panel
- 画框Frame
- 2 让坦克动起来
- 画板Panel
- 3 本章作业
1 绘制坦克
坦克
不同坦克有共同属性,可以先提取共同特征(坐标位置)作为父类,然后其他坦克类继承它。
画板Panel
有坦克在画板上显示,所以包含不同的坦克子类,并在构造器初始化时创建该具体对象。
paint方法中:
- g.fillRect创建黑色背景
- 画坦克,由于代码会进行复用(会画很多坦克),所以在Panel类中专门写方法drawTank实现。其中包括对坦克类型(我方为青色,敌方为黄色)和前进方向(具体绘制,包括上下左右朝向)的设置
画框Frame
有画板在画框中,所以包含Panel对象,并在构造器初始化时创建该具体对象。
构造器对于画板对象的设置,包括:
- 在Frame类对象中创建并添加画板Panel
- 设置Panel大小、默认关闭操作、是否可见
2 让坦克动起来
画板Panel
实现KeyListener接口,在keyPressed方法中通过WSAD键实现对坦克上下左右的控制,并调用this.repaint();重新绘制坦克。
上下左右的控制:
keyPressed中,以向上移动举例:
- 将坦克对象的方向设置好,然后朝该方向移动一定位置(坐标±speed)
- 由上引出方向direct和速度speed两个变量,均加入Tank类进行实现。
- 同时,移动位置也集成到Tank类中,可以直接对类中的坐标进行操作。
在Frame中添加this.addKeyListener(mp);(mp是Panel)用于监听。
3 本章作业
首先考虑到敌方坦克具有其特殊属性,所以单独建类EnemyTank,继承父类Tank。
考虑到增删的便利性、迭代的高效性和最重要的线程安全,我们使用集合Vector对坦克进行存储(静态数组三种优势都没有,ArrayList则是没有线程安全性)。
建立enemyTankSize作为敌方坦克的计数器,并在遍历集合时使用该变量,不然可能会出现被击毁的敌方坦克仍然显示的情况