在Java中如何让一个if语句在执行之前等待?

3
我正在尝试让Java在评估if语句之前等待1秒钟,以查看它是否应该改变boolean值。我已经设置了一个条件,如果矩形r与矩形y相交,则布尔值“Intersect”变为true,并且r向后移动。1秒钟后,我想要一个if语句来检查r是否仍然与y相交。如果没有,"Intersect"再次变为false,r停止向后移动。我该怎么做?这些语句位于同一线程中,并涉及动画效果,因此Thread.sleep()无法正常工作,因为它会使动画变得很不连贯。
这是与问题相关的代码片段:
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

public class Game extends JFrame {

boolean p1Intersect=false;

private class Move1 extends Thread {
    public void run() {

if((p1horizontal.intersects(grass1)&&(hleft==true||hright==true)&&p1Intersect!=true) {  //Normal speed
        p1Speed = 5;
    }
if(p1horizontal.intersects(edge2)&&hleft==true) { //moves backwards after collision as long as p1Intersect = true
        p1Speed=-4;
        p1Intersect=true;
    }
if((p1horizontal.intersects(edge2)&&hleft==true)==false) { //This is the statement that I would like to wait for 1 second before executing
p1Intersect=false;
    }

2
动画和逻辑应该分开。动画应该在事件分派线程中运行。Thread.sleep 是你应该使用的。是什么触发了动画? - galchen
1
@galchen:你是在建议在事件分派线程中调用Thread.sleep(...)吗? - Hovercraft Full Of Eels
绝对不行,但动画应该放在事件分发中,而睡眠则应该放在逻辑中。 - galchen
2个回答

2
原则上,您要做的是设置一个计时器,在检测到第一个事件后一秒钟触发。如果在该事件触发时,检查矩形是否仍然相交。如果是,则在那时采取任何必要的行动。
正如您注意到的,Thread.sleep()将停止整个线程的执行,并且不会发生其他任何事情。这也会使您的动画变得抖动。

+1:您可能还可以检测一些明确表示您不需要触发守护语句的事件,从而使您能够提前取消计时器。(尽管这实际上是因为底层交互本身就很复杂,但基于事件的编程可能会变得有点复杂。) - Donal Fellows

1
在游戏设计中,尽量将逻辑保留在主线程中(也就是说,我会避免使用计时器)。我建议采用以下解决方案:
当检测到交叉点时,使用long intersectTime = System.currentTimeMillis()将系统时间存储在一个长整型变量中。
现在,在第二个if语句中,只需检查额外的条件System.currentTimeMillis()-intersectTime>1000,因为1000毫秒等于1秒。

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