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

Java开发问题:实现变量受击后指定时长内不再减少

解决碰撞冷却的问题

嘿,我明白你的困扰——用Thread.sleep()确实不行,因为它会把整个游戏线程卡住,导致画面冻结,这绝对不是游戏里处理冷却的正确方式。咱们换个思路,用计时器变量来跟踪冷却时间,这样既不会阻塞游戏,又能精准控制冷却时长。

具体步骤:

首先,在你的类里添加两个新变量:

// 冷却时长(单位:游戏帧,假设你的游戏是60帧/秒,120就是2秒,可按需调整)
private int hitCooldown = 120;
// 冷却计时器,用来倒计时
private int cooldownTimer = 0;

然后修改你的damage()方法,把冷却逻辑加进去:

public void damage() { 
    // 先处理冷却计时器:如果计时器还没到0,每帧递减1
    if (cooldownTimer > 0) {
        cooldownTimer--;
    }

    Actor Gegner = (Actor) getOneObjectAtOffset(0, (getImage().getHeight()/2)+3, Gegner.class); 
    
    if(Gegner != null) { // 这里应该是null不是zero哦
        getWorld().removeObject(Gegner); // 原代码里的Gegner2大概率是笔误啦
    }

    // 只有当不在冷却中,并且碰到Gegner时,才执行扣血逻辑
    if(isTouching(Gegner.class) && cooldownTimer == 0) { 
        leben--;
        // 触发冷却,重置计时器
        cooldownTimer = hitCooldown;
        getWorld().removeObject(Gegner);
    }
}

逻辑解释:

  • cooldownTimer会在每帧调用damage()时自动递减,直到归0,这时候才允许再次扣血。
  • 每次成功扣血后,我们把cooldownTimer重置为hitCooldown的值,这样就进入了冷却期,这段时间内哪怕一直保持碰撞状态,也不会再减少leben。
  • 去掉了原来的touching变量,因为计时器已经能完美替代它的作用,逻辑更简洁清晰。

这样调整后,就不会出现碰撞期间连续扣血的问题啦,而且整个游戏也不会因为sleep而卡顿。你可以根据自己的游戏帧率调整hitCooldown的数值,比如60就是1秒,240就是4秒,灵活得很~

内容的提问来源于stack exchange,提问作者leo.rocket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:42:41