🌲创建子弹类
👕要想发射子弹,要先有一个子弹类
- 其中包含子弹的位置
- 子弹的速度
- 子弹的方向
- 子弹的存活状态
👕主要的一点是我们要把发射出去的子弹当作一个线程对待,并且当发射出去的这个子弹越界(查出我们设定框架的范围)的时候就停止线程的工作
public class Shot implements Runnable{
int x;
int y;
int direct=0;
int speed=5;
boolean isLive=true;
public Shot(int x, int y, int direct) {
this.x = x;
this.y = y;
this.direct = direct;
}
@Override
public void run() {
while (isLive){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
switch (direct){
case 0:
y-=speed;
break;
case 1:
x+=speed;
break;
case 2:
y+=speed;
break;
case 3:
x-=speed;
break;
}
🎏当击中坦克或者越界则自动消失
🎏线程终止
if(!(x>=0&&x<=1000&&y>=0&&y<=750&&isLive)){
isLive=false;
break;
}
}
}
}
🌲添加子弹到己方坦克类
- 👕要再添加一个事件监听事件当我们按下J时候就可以发射子弹,相当于启动了子弹这个线程
- 👕通过在己方的坦克类中,获取己方坦克的位置和方向进而可以获取到子弹的位置和方向,然后再从己方坦克的类中创建一个新的子弹类,并且启动这颗要发射的子弹的线程即可
public class Hero extends Tank { 定义一颗子弹 Shot shot=null; public Hero(int x, int y) { super(x, y); } public void shotEnemyTank(){ ✨根据己方坦克获取要发射子弹的方向和位置 ✨这个自己可以先通过在纸上根据坦克的方向判断出要发射子弹的方向 ✨然后在通过代码实现就会变得简单了 switch (getDirect()){ case 0: shot=new Shot(getX()+20,getY(),0); break; case 1: shot=new Shot(getX()+60,getY()+20,1); break; case 2: shot=new Shot(getX()+20,getY()+60,2); break; case 3: shot=new Shot(getX(),getY()+20,3); break; } 👼👼👼在创建好子弹后最后不要忘记启动子弹的线程 new Thread(shot).start(); } }
🌲添加发射子弹的事件监听机制
- 👕还是在MyPanel里面的keyPressed()方法中添加当按J的时候就启动子弹线程
- 👕到此,事件监听机制的完整代码如下
@Override public void keyPressed(KeyEvent e) { if(e.getKeyCode()==KeyEvent.VK_W){ if(hero.getY()>0){ hero.moveUp(); } hero.setDirect(0); } else if (e.getKeyCode()==KeyEvent.VK_D) { if(hero.getX()+60<1000){ hero.moveRight(); } hero.setDirect(1); } else if (e.getKeyCode()==KeyEvent.VK_S) { if (hero.getY()+60<750){ hero.moveDown(); } hero.setDirect(2); }else if (e.getKeyCode()==KeyEvent.VK_A) { if (hero.getX()>0){ hero.moveLeft(); } hero.setDirect(3); } 🧨🧨🧨监听发射子弹事件 if (e.getKeyCode()==KeyEvent.VK_J){ hero.shotEnemyTank(); } 🥽🥽🥽一定不要忘记重绘面板 🎑🎑🎑否则是静态的效果 this.repaint(); }