我正在尝试让Java等待1秒钟,然后再评估if语句,看它是否应该更改布尔值。
我设置了如果Rectangle r与Rectangle y相交,则布尔“Intersect”变为true并且r向后移动。 1秒后,我想要一个if语句来检查r是否仍然与y相交。如果不是,“相交”再次变为假,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;
}
答案 0 :(得分:2)
原则上,您要做的是设置一个计时器,它会在检测到第一个事件后触发一秒钟。如果,当该事件触发时,检查您的矩形是否仍然相交。如果是这样,请采取您需要的任何行动。
正如您所注意到的,Thread.sleep()
将停止执行整个线程,其他任何事情都不会发生。这也会让你的动画变得蠢蠢欲动。
答案 1 :(得分:1)
在游戏设计中,尝试在主线程中保留逻辑(也就是说,我会避免使用计时器)。我建议采用以下解决方案:
检测到交叉点时,将系统时间存储在很长时间内,
使用long intersectTime = System.currentTimeMillis()
。
现在,在第二个if语句中,只需检查额外条件
System.currentTimeMillis()-intersectTime>1000
因为1000毫秒= 1秒。