在libgdx游戏中设置延迟

8
我有一个游戏(类似超级跳跃,这是一个跳跃游戏),我们的角色有生命值。与敌人碰撞后,他的生命值会减少。我想在1秒后计算碰撞。也就是说,在这1秒钟内,如果我的角色接触到敌人,什么也不会发生,他会继续前进。
为此,我在我的GameScreen类中定义了一个布尔变量,名为“collision”,另一个在Wolrd类中,名为“collBirds”。与敌人接触一次后,碰撞和collBirds变为true。但我希望在1秒后collistion变为false。我尝试使用System.currentTimeMillis()和“for循环”等多种方法,但没有任何效果。我在java方面不太擅长。
这是我的条件:
if(World.collBirds == true && collition == false){
        life -= 1;
        lifeString = "Life : " + life;
        World.collBirds = false;
        collition = true;
        for (??? "need to stay here for 1 sec" ???) {
            collition = false;
        }
    }

1
请查看这个问题 - Piotr Praszmo
谢谢您的回复。我已经阅读并使用了它。但是我在我的游戏中做了一些改变,最终它成功了。 - Hosein
3个回答

38
在某些情况下,您可能还想使用com.badlogic.gdx.utils.Timer
示例用法:
float delay = 1; // seconds

Timer.schedule(new Task(){
    @Override
    public void run() {
        // Do your work
    }
}, delay);

7

当第一次碰撞发生时,设置一个float timeSinceCollision = 0;

然后每次循环,您需要将自上次检查以来的时间添加到变量中,并检查是否超过了一秒钟。

timeSinceCollision += deltaTime;
if(timeSinceCollision > 1.0f) {
    // do collision stuff
} else {
    // ignore the collision
}

它只在第一次运行时有效,碰撞后一个点会从生命中减少,但是在其他时间里,什么也不会发生... - Hosein
3
在“处理碰撞”分支中重置“timeSinceCollision”的值? - Ludevik

0
如果您想在同一线程中执行此操作,可以使用Thread.sleep()。但在这种情况下,您当前的线程将会冻结,如果这是单线程游戏,那么整个游戏都将会冻结。如果您不希望游戏冻结1秒钟,那么您应该生成一个新线程,在该线程中调用sleep,并在sleep之后更改标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接