需求
当用户按下J键,用户坦克就发射一颗子弹
思路
1、当发射一颗子弹后,就相当于启动一个线程
2、Hero有子弹的对象,当按下J时、我么就启动一个发射行为(线程),让子弹不停的移动,形成一个射击的效果
3、我们的MyPanel需要不停的重绘 子弹,才能实现子弹移动的效果
4、当子弹移动到面板边界时、就应该销毁(把启动的线程销毁)
步骤
1、新建子弹实体类
package com.tank.tankgame2;
/**
* 射击子弹实体
*/
public class Shot implements Runnable {
int x; // 子弹x坐标
int y; // 子弹y坐标
int direct = 0; // 子弹的方向
int speed = 2; // 子弹的速度
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 (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 根据方向来改变x,y坐标
switch (direct){
case 0: // 上
y-=speed;
break;
case 1: // 右
x+=speed;
break;
case 2: // 下
y+=speed;
break;
case 3: // 左
x-=speed;
break;
}
System.out.println("子弹 x="+x + "y="+y);
// 当子弹触发边界线程销毁
if(!(x>=0 && x<=1000 && y>=0 && y<=750)){
isLive=false;
break;
}
}
}
}
2、在自己的坦克对象中加入子弹
package com.tank.tankgame2;
/**
* 自己的坦克
*/
public class Hero extends Tank {
// 定义一个Shot对象,表示一个射击(线程)
Shot shot = null;
public Hero(int x, int y) {
super(x, y);
}
// 射击
public void shotEnemyTank(){
// 创建Shot对象 , 根据当前的Hero对象的位置和方向来创建Shot
switch (getDirect()){ // 得到Hero对象方向
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;
}
// 启动shot线程
new Thread(shot).start();
}
}
3、在面板中增加监听(J键)
// 如果用户按下的是J,就发射
if(e.getKeyCode() == KeyEvent.VK_J){
hero.shotEnemyTank();
}
网友评论