前期相关文章
一、任务需求
添加hero坦克子弹并且发射。
二、思路
1.创建子弹类
1.由于每颗子弹都是一个独立的线程,会不断变换子弹坐标,所以子弹类要实现Runnable接口。
2.子弹需要坐标x,y以及方向,所以构造函数有三个参数。
3.实现Runnable接口后,要覆盖run方法:
1.如果不让线程sleep,子弹飞出去很快,快到在屏幕如上瞬间消失。
2.所以增加一个sleep()
3.另外,子弹需要判断四个方向,增加switch语句
4.子弹跑出屏幕需要死亡,增加变量islive判断是否存活。否则无限制飞行,不断占用内存空间。
2.hero坦克类中加入shotEnemy()方法,表示发射子弹
1.新建子弹变量s
Shot s = null;
2.判断开火的方向,增加switch语句。
3.开火后,启动线程。
Thread t =new Thread(s);
t.start();
3.完成子弹实现过程,接着要在屏幕中让子弹显示,即画出子弹
1.paintComponent方法里加入,画出子弹
判断子弹是否存活
hero.s!=null很重要,游戏刚开始没有发射子弹,hero.s=null,此时进入if去画子弹会出现异常。
if(hero.s!=null&&hero.s.isLive==true){
g.setColor(Color.red);
g.draw3DRect(hero.s.x, hero.s.y, 1, 1, false);
}
2.在KeyPressed监听器处添加,按下J键发射一颗子弹
if(e.getKeyCode()==KeyEvent.VK_J){
hero.shotEnemy();
}
4.MyPanel实现Runnable接口
1.由于子弹打出去后,需要不断让它显示,屏幕每隔一段时间需要repaint()
所以重载run()方法,让MyPanel每隔一段时间repaint()一次
public void run() {
while(true){
try {
Thread.sleep(100);//休息100ms,重画一次MyPanel
} catch (Exception e) {
e.printStackTrace();
}
repaint();
}
5.由于MyPanel实现了Runnable接口,所以让该线程跑起来
1.在MyTankGame方法中启动线程即可
p1 = new MyPanel();
Thread t = new Thread(p1);
t.start();
三、代码如下
MyTankGame.java
/** * 功能:坦克游戏的2.0 * 1.画出坦克 * 2.坦克的移动 * 3.坦克发射子弹 */
package Tank_03;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.K