NetBeans太空射击游戏:子弹碰撞后未移除问题求助
太空射击游戏子弹碰撞移除问题修复
原代码核心问题
- 碰撞检测逻辑失效:仅判断单方向坐标差值≤5,未取绝对值,反向位置的子弹无法触发检测;且未遵循圆形碰撞规则(两个半径5的子弹,中心距离需≤10才会碰撞)。
- 索引传递缺失:
hitByBullet仅返回我方子弹索引,未记录对应敌方子弹索引,后续无法精准移除敌方子弹。 - 移除操作错误:
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
相关产品推荐
相关产品推荐

