Java Timer类开发问题:角色入敌区后每5秒扣10生命值异常
解决Timer每5秒扣血的问题
我来帮你排查下这个Timer的问题~你现在的代码导致持续扣血而不是每5秒一次,主要有几个关键问题,我一步步给你分析和修正:
问题分析
setRepeats(false)是核心问题:这个设置会让Timer只执行一次actionPerformed就停止,但你需要的是每5秒重复触发,所以这个配置必须去掉(或者改成true,不过Timer默认就是重复执行的)。- 时间参数错了:你设置的是3000毫秒(3秒),但需求是5秒,得改成5000。
- 代码结构混乱:比如重复声明了
g变量,Timer的初始化和启动逻辑也没封装好,容易导致作用域问题。
修正后的代码示例
我重构了一个更易用的Timer类,专门处理敌人区域的扣血逻辑,还加上了启动/停止的控制(避免角色离开区域后还在扣血):
import javax.swing.Timer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; class EnemyAreaTimer { private final gubbe player; private Timer damageTimer; // 构造时传入玩家对象,方便操作生命值 public EnemyAreaTimer(gubbe player) { this.player = player; // 初始化5秒触发一次的Timer damageTimer = new Timer(5000, e -> player.removeHealth(10)); // 显式设置重复执行(默认就是true,写出来更清晰) damageTimer.setRepeats(true); } // 角色进入敌人区域时调用,启动扣血 public void start() { if (!damageTimer.isRunning()) { damageTimer.start(); } } // 角色离开敌人区域时调用,停止扣血 public void stop() { if (damageTimer.isRunning()) { damageTimer.stop(); } } }
使用方式
- 当你的角色检测到进入敌人区域时:
// 假设player是你的角色实例 EnemyAreaTimer timer = new EnemyAreaTimer(player); timer.start(); - 当角色离开敌人区域时,记得调用
timer.stop(),这样就不会继续扣血了。
额外注意点
- 你的原代码里重复声明了
g变量(g = new gubbe();和gubbe g;),这会导致编译错误,要删掉其中一个,最好是通过构造函数传入角色实例,避免硬编码创建。 - 如果你的
gubbe类里的RemoveHealth()方法是固定扣10血,那直接用player.RemoveHealth()也可以,我改成带参数的removeHealth(10)是为了更灵活。 - 要是你用的是游戏引擎(比如LibGDX),建议用引擎自带的定时器,比Swing Timer更适配游戏场景,但如果是Swing小游戏,上面的代码完全够用。
内容的提问来源于stack exchange,提问作者user11582989
相关产品推荐
相关产品推荐

