You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java平台游戏Enemy类移动异常求助及代码优化建议

问题分析与解决方案

先帮你解决敌方无法跟随玩家移动的核心问题,再聊聊代码里可以优化的地方:

敌方移动异常的原因与修复

你的Enemy2类在初始化时只保存了玩家初始位置playerxplayery,之后玩家移动时,Enemy2内部的这两个变量不会自动更新,导致敌人一直朝着玩家的出生点移动,完全没跟上玩家当前位置。

修复方案(选一个就行)

方案1:让move方法接收实时玩家坐标

修改Enemy2move方法,每次调用时传入最新的玩家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改成PlatformerEnemy2如果没有多个Enemy变体可以直接叫Enemy
  • 变量名用小驼峰,布尔变量建议加前缀(比如playerrightisPlayerMovingRightjumpisJumping),坐标变量改成playerXplayerY(代替playerx),一眼就能看懂含义
  • 避免模糊命名:yChange可以改成jumpVelocityheight改成groundY(因为它代表地面的Y坐标)

2. 魔法值换成常量

代码里的14007565(玩家移动速度)、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. 封装原则要遵守

主程序里的playerXplayerY这些变量应该用private修饰,通过getter/setter访问;不要单独维护enemyxenemyy,让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

火山引擎 最新活动