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

Processing开发太空入侵者游戏碰撞检测与外星人下移问题求助

修复方案

1 外星人无法向下移动问题

问题原因

你实际渲染外星人时使用的是ShipY[]数组中存储的每一行Y坐标,但碰撞边界后仅修改了未被使用的全局变量SpaceshipY,二者没有关联,因此下移逻辑不生效。同时moveSpaceShip()被放在外星人渲染的双重循环中,会重复执行60次,存在逻辑冗余。

修复代码

调整setSpaceShipPositions()避免X坐标重复赋值:

void setSpaceShipPositions() {
  // X坐标仅需赋值1次,调整间距避免外星人重叠
  for (int i = 0; i < ShipX.length; i++) {
    ShipX[i] = 50 + 60*i;
  }
  for(int j = 0; j < ShipY.length; j++){
    ShipY[j] = 50 + 60*j;
  }
}

修改checkIfHitEdge()同步更新所有行的Y坐标:

void checkIfHitEdge() {
  // 仅判断最左、最右侧外星人的边界即可,无需循环
  if (ShipX[14] > 990 || ShipX[0] < 10) {
    spaceShipDirection *= -1;
    // 所有行外星人同步下移
    for (int j = 0; j < ShipY.length; j++) {
      ShipY[j] += 20; // 可自行调整下移步长
    }
  }
}

调整startGame()中moveSpaceShip()的位置,移出双重循环:

void startGame() {
  background (#2f3069);
  MakeLaser();
  Maketank();
  Maketankmove();
  checkiftankhitedge();
  // 移动逻辑放到循环外,仅执行1次即可
  moveSpaceShip();
 
  for (int j = 0; j < ShipY.length; j++) {
    for (int i = 0; i < ShipX.length; i++) {
      MakeSpaceShip(i,j);
      checkiflaserhitspaceship(i,j);
    }
  }

  Shootlaser();
  Makelaserreturentoorignalposition();
}

2 激光与外星人碰撞检测实现

实现逻辑

使用*轴对齐包围盒(AABB)*检测规则:两个矩形只要存在坐标重叠即判定为碰撞,需同时满足四个边界判断条件。由于你设置了imageMode(CENTER),计算边界时需要以坐标为中心加减一半的图像尺寸。

修复后的checkiflaserhitspaceship()代码:

void checkiflaserhitspaceship(int i, int j) {
  // 跳过已经被销毁的外星人
  if (ShipX[i] < 0) return;

  // 计算激光的四个边界
  float laserLeft = LaserX - LasersizeX/2f;
  float laserRight = LaserX + LasersizeX/2f;
  float laserTop = LaserY - LasersizeY/2f;
  float laserBottom = LaserY + LasersizeY/2f;

  // 计算当前外星人的四个边界
  float shipLeft = ShipX[i] - ShipSizeX/2f;
  float shipRight = ShipX[i] + ShipSizeX/2f;
  float shipTop = ShipY[j] - ShipSizeY/2f;
  float shipBottom = ShipY[j] + ShipSizeY/2f;

  // 碰撞判定
  boolean isHit = laserRight > shipLeft 
                && laserLeft < shipRight 
                && laserBottom > shipTop 
                && laserTop < shipBottom;

  if (isHit) {
    // 销毁当前外星人
    ShipX[i] = -9999;
    // 激光复位
    ShowLaser = false;
    LaserX = 9999;
    LaserY = TankY;
  }
}

内容的提问来源于stack exchange,提问作者Namir Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:15:06