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

Java Timer类开发问题:角色入敌区后每5秒扣10生命值异常

解决Timer每5秒扣血的问题

我来帮你排查下这个Timer的问题~你现在的代码导致持续扣血而不是每5秒一次,主要有几个关键问题,我一步步给你分析和修正:

问题分析

  1. setRepeats(false) 是核心问题:这个设置会让Timer只执行一次actionPerformed就停止,但你需要的是每5秒重复触发,所以这个配置必须去掉(或者改成true,不过Timer默认就是重复执行的)。
  2. 时间参数错了:你设置的是3000毫秒(3秒),但需求是5秒,得改成5000。
  3. 代码结构混乱:比如重复声明了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();
        }
    }
}

使用方式

  1. 当你的角色检测到进入敌人区域时:
    // 假设player是你的角色实例
    EnemyAreaTimer timer = new EnemyAreaTimer(player);
    timer.start();
    
  2. 当角色离开敌人区域时,记得调用timer.stop(),这样就不会继续扣血了。

额外注意点

  • 你的原代码里重复声明了g变量(g = new gubbe();和gubbe g;),这会导致编译错误,要删掉其中一个,最好是通过构造函数传入角色实例,避免硬编码创建。
  • 如果你的gubbe类里的RemoveHealth()方法是固定扣10血,那直接用player.RemoveHealth()也可以,我改成带参数的removeHealth(10)是为了更灵活。
  • 要是你用的是游戏引擎(比如LibGDX),建议用引擎自带的定时器,比Swing Timer更适配游戏场景,但如果是Swing小游戏,上面的代码完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:26:28