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
相关产品推荐
相关产品推荐

