当前位置:网站首页>己方坦克发射子弹
己方坦克发射子弹
2022-06-11 18:19:00 【C_x_330】
创建子弹类
要想发射子弹,要先有一个子弹类
- 其中包含子弹的位置
- 子弹的速度
- 子弹的方向
- 子弹的存活状态
主要的一点是我们要把发射出去的子弹当作一个线程对待,并且当发射出去的这个子弹越界(查出我们设定框架的范围)的时候就停止线程的工作
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(); }
边栏推荐
猜你喜欢
随机推荐
牛客刷题——二叉搜索树与双向链表
Swagger2简单使用
Summary of common mysql/redis interview questions
[Golang]力扣Leetcode - 292. Nim 游戏(数学)
Non recursive traversal of binary tree
TI AM64x——最新16nm处理平台,专为工业网关、工业机器人而生
Various poses for text modification using sed
* Jetpack 笔记 使用DataBinding
牛客刷题——求最小公倍数
Force deduction 32 questions longest valid bracket
论高可用架构
[C语言]用结构体把平均分和低于等于平均分的学生数据输出
Feign shares login information for request
The HashSet collection stores student objects and traverses
全志科技T3开发板(4核ARM Cortex-A7)——MQTT通信协议案例
Niu Ke's questions -- two sorting methods
Mysql深入完全学习---阶段1---学习总述
公共字段自动填充,你了解吗
*Use of jetpack notes room
Labelme for image data annotation



![[golang] leetcode - 292 Nim games (Mathematics)](/img/82/54c3f6be9d08687b42cba0487380f0.png)

![[C语言]用结构体按分数高低降序输出学生的姓名和分数](/img/41/b9dba88941560b296f4d7153b7c684.png)



