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
相关产品推荐
相关产品推荐

