You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetBeans太空射击游戏:子弹碰撞后未移除问题求助

太空射击游戏子弹碰撞移除问题修复

原代码核心问题

  1. 碰撞检测逻辑失效:仅判断单方向坐标差值≤5,未取绝对值,反向位置的子弹无法触发检测;且未遵循圆形碰撞规则(两个半径5的子弹,中心距离需≤10才会碰撞)。
  2. 索引传递缺失:hitByBullet仅返回我方子弹索引,未记录对应敌方子弹索引,后续无法精准移除敌方子弹。
  3. 移除操作错误:bulletsHit中remove(this)完全无效,this并非子弹对象或索引,无法定位要删除的元素。

修正后的代码实现

// 查找碰撞的子弹对,返回我方/敌方子弹索引数组,无碰撞则返回null
private int[] findCollidingBullets() {
    for (int i = 0; i < bullets.size(); i++) {
        Bullet playerBullet = bullets.get(i);
        for (int j = 0; j < bulletsEnemy.size(); j++) {
            Bullet enemyBullet = bulletsEnemy.get(j);
            
            // 计算两子弹中心坐标差
            double dx = playerBullet.getX() - enemyBullet.getX();
            double dy = playerBullet.getY() - enemyBullet.getY();
            // 用距离平方判断碰撞(避免开根号,提升性能)
            double distanceSquared = dx * dx + dy * dy;
            
            // 两子弹半径均为5,碰撞阈值为(5+5)²=100
            if (distanceSquared <= 100) {
                return new int[]{i, j};
            }
        }
    }
    return null;
}

public boolean bulletsHit() {
    int[] collisionPair = findCollidingBullets();
    if (collisionPair != null) {
        // 根据索引移除对应子弹
        bulletsEnemy.remove(collisionPair[1]);
        bullets.remove(collisionPair[0]);
        return true;
    }
    return false;
}

关键修正说明

  • 精准碰撞判断:通过坐标差平方和检测碰撞,既符合圆形子弹的物理规则,又避免浮点运算损耗。
  • 双向索引定位:返回碰撞双方的索引,确保能准确移除对应的敌方和我方子弹。
  • 正确移除操作:直接使用索引调用remove方法,精准定位待删除元素。

额外注意事项

确保Bullet类的getX()和getY()返回子弹中心坐标,而非左上角或其他偏移位置,否则会导致碰撞检测偏差。

内容的提问来源于stack exchange,提问作者Uri Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:21:01