子弹超出界面删除子弹对象

实现思路:

    通过循环遍历获取子弹,调用子弹销毁方法.

    如果子弹的x坐标小于0或者大于界面宽度删除子弹对象.

    如果子弹的y坐标小于0或者大于界面高度删除子弹对象.

 

代码实现:

  1、设置类循环遍历子弹

 1 package Itheima;
 2 
 3 import java.util.List;
 4 import java.util.concurrent.CopyOnWriteArrayList;
 5 
 6 import org.itheima.game.Window;
 7 import org.lwjgl.input.Keyboard;
 8 
 9 import Itheima.bean.Bullet;
10 import Itheima.bean.Direction;
11 import Itheima.bean.Element;
12 import Itheima.bean.Tank;
13 import Itheima.bean.Wall;
14 
15 public class TankWorld extends Window {
16     Tank tank;
17     Wall wall;
18     List<Element> list;
19 
20     public TankWorld(String title, int width, int height, int fps) {
21         super(title, width, height, fps);
22         // TODO 自动生成的构造函数存根
23     }
24 
25     @Override
26     protected void onCreate() {
27         list = new CopyOnWriteArrayList<>();
28         tank = new Tank(0, 0);
29         wall = new Wall(64, 64);
30         list.add(tank);
31         list.add(wall);
32     }
33 
34     @Override
35     protected void onMouseEvent(int key, int x, int y) {
36         // TODO 自动生成的方法存根
37 
38     }
39 
40     @Override
41     protected void onKeyEvent(int key) {
42         switch (key) {
43         case Keyboard.KEY_UP:
44             tank.move(Direction.UP);
45             break;
46 
47         case Keyboard.KEY_DOWN:
48             tank.move(Direction.DOWN);
49             break;
50         case Keyboard.KEY_LEFT:
51             tank.move(Direction.LEFT);
52             break;
53         case Keyboard.KEY_RIGHT:
54             tank.move(Direction.RIGHT);
55             break;
56         case Keyboard.KEY_SPACE:
57             Bullet bullet = tank.fire();
58             list.add(bullet);
59             break;
60         }
61     }
62 
63     @Override
64     protected void onDisplayUpdate() {
65         for (Element e : list) {
66             e.draw();
67             System.out.println(list.size());
68         }
69 
70         
71         for (Element e1 : list) {
72             if(e1 instanceof Tank){    //遍历到Tank对象
73                 Tank t = (Tank) e1;    //将e1转换成Tank类
74                 for (Element e2 : list) {    
75                     if(e2 instanceof Wall){    //遍历到Wall对象
76                         Wall w = (Wall) e2;    //将e2转换成Wall对象
77                         boolean result = t.impact(w);    //判断Tank与Wall是否发生碰撞
78                         if(result){
79                             break;  //如果撞上了就跳出循环 不继续和下一个墙做判断
80                         }
81                     }
82                 }
83             }
84         }
85         
86         for (Element e1 : list) {
87             if(e1 instanceof Bullet){    //如果e1是子弹
88                 Bullet b = (Bullet) e1;    //将e1转换成子弹对象
89                 boolean result = b.isDestroy(); //调用子弹销毁方法
90                 if(result){    
91                     list.remove(b); //从集合删除子弹对象
92                 }
93             }
94         }
95     }
96 
97 }
TankWorld

  2、子弹类销毁方法

 1 package Itheima.bean;
 2 
 3 import java.io.IOException;
 4 
 5 import org.itheima.game.utils.DrawUtils;
 6 
 7 import Itheima.Constants;
 8 
 9 public class Bullet extends Element {
10     Direction dir;    
11     private int speed = 32;    //子弹速度
12     public Bullet(Tank tank) {
13         int x1 = tank.x;
14         int y1 = tank.y;
15         int w1 = tank.width;
16         int h1 = tank.height;
17         this.dir = tank.dir;
18         switch (dir) {    //根据tank的方向计算子弹坐标
19         case UP:
20             this.imagePath = "res/img/bullet_u.gif";
21             getSize();
22             this.x = x1 + (w1 - this.width) / 2;
23             this.y = y1 - this.height;
24             break;
25 
26         case DOWN:
27             this.imagePath = "res/img/bullet_d.gif";
28             getSize();
29             this.x = x1 + (w1 - this.width) / 2;
30             this.y = y1 + w1;
31             break;
32         case LEFT:
33             this.imagePath = "res/img/bullet_l.gif";
34             getSize();
35             this.x = x1 - this.width;
36             this.y = y1 + (h1 - this.height) / 2;
37             break;
38         case RIGHT:
39             this.imagePath = "res/img/bullet_r.gif";
40             getSize();
41             this.x = x1 + w1;
42             this.y = y1 + (h1 - this.height) / 2;
43             break;
44         }
45     }
46 
47     public void draw() {    //重写draw方法
48         try {
49             DrawUtils.draw(imagePath, x, y);
50         } catch (IOException e) {
51             // TODO 自动生成的 catch 块
52             e.printStackTrace();
53         }
54         switch (dir) {
55         case UP:
56             y -= speed;
57             break;
58 
59         case DOWN:
60             y += speed;
61             break;
62         case LEFT:
63             x -= speed;
64             break;
65         case RIGHT:
66             x += speed;
67             break;
68         }
69     }
70 
71     public boolean isDestroy() {    //子弹销毁方法
72         if(x<0 || x>Constants.WIDTH || y<0 || y>Constants.HEIGHT){
73             return true;
74         }
75         return false;
76     }
77 }
Bullet

 

  

随笔说:

      如果不进行删除无效的对象,运行时间越长,则游戏数据会越来越大。

    所以还是有必要优化一下的。

 

转载于:https://www.cnblogs.com/LastingzZoO/p/7508023.html

在C语言中实现飞机大战游戏,需要使用图形库(如graphics.h)来显示游戏界面。对于敌机发射子弹这个功能,可以通过以下步骤实现: 1. 定义子弹结构体,包含子弹的位置和速度等信息。 2. 在游戏循环中,检查敌机是否需要发射子弹,如果需要则创建一个新的子弹对象,并将其加入到子弹数组中。 3. 在每一帧中,遍历子弹数组,更新子弹的位置,并将其绘制到屏幕上。 4. 检查子弹是否击中了玩家飞机或者超出了屏幕范围,如果是则将其从子弹数组中移除。 5. 在玩家飞机的碰撞检测中,也需要检查子弹是否击中了玩家飞机。 下面是一个简单的示例代码: ``` // 定义子弹结构体 typedef struct { int x, y; // 子弹的坐标 int speed; // 子弹的速度 int active; // 子弹是否可用(是否在屏幕上) } Bullet; // 创建子弹数组 Bullet bullets[MAX_BULLETS]; // 在游戏循环中检查敌机是否需要发射子弹 if (enemy_shoot()) { // 创建一个新的子弹对象 Bullet new_bullet; new_bullet.x = enemy_x; new_bullet.y = enemy_y + enemy_height; new_bullet.speed = BULLET_SPEED; new_bullet.active = 1; // 将新的子弹对象加入到子弹数组中 for (int i = 0; i < MAX_BULLETS; i++) { if (!bullets[i].active) { bullets[i] = new_bullet; break; } } } // 在每一帧中遍历子弹数组,更新子弹的位置,并将其绘制到屏幕上 for (int i = 0; i < MAX_BULLETS; i++) { if (bullets[i].active) { // 更新子弹的位置 bullets[i].y += bullets[i].speed; // 绘制子弹到屏幕上 draw_bullet(bullets[i].x, bullets[i].y); // 检查子弹是否击中了玩家飞机或者超出了屏幕范围 if (bullets[i].y < 0 || bullets[i].y > SCREEN_HEIGHT || check_collision(player_x, player_y, player_width, player_height, bullets[i].x, bullets[i].y, bullet_width, bullet_height)) { bullets[i].active = 0; // 将子弹标记为不可用 } } } // 在玩家飞机的碰撞检测中,也需要检查子弹是否击中了玩家飞机 for (int i = 0; i < MAX_BULLETS; i++) { if (bullets[i].active && check_collision(player_x, player_y, player_width, player_height, bullets[i].x, bullets[i].y, bullet_width, bullet_height)) { // 子弹击中了玩家飞机,执行相应操作 } } ``` 需要注意的是,以上代码仅为示例,实际实现中可能需要进行适当的修改。同时,子弹的发射也需要考虑敌机的位置、速度等因素,以保证游戏的难度和可玩性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值