Java平台游戏Enemy类移动异常求助及代码优化建议
先帮你解决敌方无法跟随玩家移动的核心问题,再聊聊代码里可以优化的地方:
敌方移动异常的原因与修复
你的Enemy2类在初始化时只保存了玩家初始位置的playerx和playery,之后玩家移动时,Enemy2内部的这两个变量不会自动更新,导致敌人一直朝着玩家的出生点移动,完全没跟上玩家当前位置。
修复方案(选一个就行)
方案1:让move方法接收实时玩家坐标
修改Enemy2的move方法,每次调用时传入最新的玩家X坐标:
public void move(int currentPlayerX) { if(startX > currentPlayerX){ startX -= speed; } else if(startX < currentPlayerX){ startX += speed; // 把原来的startX -= speed*-1改成这个,可读性更好 } }
然后在主程序的run方法里,把原来的enemy.move();替换成enemy.move(playerx);,这样敌人每次移动都会基于玩家当前位置计算。
方案2:给Enemy2加更新玩家位置的方法
在Enemy2类里新增一个方法:
public void updatePlayerPos(int x, int y) { this.playerx = x; this.playery = y; }
然后在主程序的run方法中,调用enemy.move();之前先执行:
enemy.updatePlayerPos(playerx, playery);
这样Enemy2内部的玩家坐标会同步成最新值,移动逻辑就能正常工作了。
代码中的不良编程习惯与优化方向
作为Java新手,这些小细节能帮你写出更整洁、易维护的代码:
1. 命名规范要重视
- 类名用大驼峰:
platformer改成Platformer,Enemy2如果没有多个Enemy变体可以直接叫Enemy - 变量名用小驼峰,布尔变量建议加前缀(比如
playerright→isPlayerMovingRight,jump→isJumping),坐标变量改成playerX、playerY(代替playerx),一眼就能看懂含义 - 避免模糊命名:
yChange可以改成jumpVelocity,height改成groundY(因为它代表地面的Y坐标)
2. 魔法值换成常量
代码里的1400、756、5(玩家移动速度)、20(跳跃初始速度)这些硬编码数值,建议定义成常量:
private static final int SCREEN_WIDTH = 1400; private static final int SCREEN_HEIGHT = 756; private static final int PLAYER_MOVE_SPEED = 5; private static final int JUMP_INITIAL_VELOCITY = -20;
后续改数值不用到处找,代码可读性也更高。
3. 代码结构要拆分
把主程序里杂乱的逻辑拆成独立方法:比如玩家移动逻辑抽成movePlayer()、射击逻辑抽成updateShots()、碰撞检测抽成checkCollisions(),让run方法的代码更简洁,出问题也更容易定位。
4. 封装原则要遵守
主程序里的playerX、playerY这些变量应该用private修饰,通过getter/setter访问;不要单独维护enemyx、enemyy,让Enemy2自己管理位置,用enemy.getStartX()、enemy.getStartY()获取,避免数据不一致。
5. 异常处理别偷懒
不要空捕获异常:catch (Exception e ) {}会隐藏错误,至少打印异常信息:e.printStackTrace();,方便排查问题。
6. 过时技术换一换
Applet是已经被废弃的Java技术,建议换成Swing(轻量)或JavaFX(现代)来开发桌面游戏,兼容性和功能都更好。
7. 导入语句要规范
把挤在一行的导入拆成单独一行:
import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.util.Random;
更易读,也方便管理依赖。
内容的提问来源于stack exchange,提问作者Jeffrey M




