Заставить один оператор if ждать выполнения в Java? - PullRequest
3 голосов
/ 02 октября 2011

Я пытаюсь заставить Java подождать 1 секунду, прежде чем вычислять оператор if, чтобы узнать, должен ли он изменить логическое значение.

Я установил, что если Rectangle r пересекает Rectangle y, логическое «Intersect» становится истинным, а r перемещается назад. Спустя 1 секунду я хочу, чтобы оператор if проверял, пересекает ли r все еще y. Если нет, «Intersect» снова становится ложным и 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 ]

2 голосов
/ 02 октября 2011

В принципе, вы хотите установить таймер , который будет срабатывать через одну секунду после обнаружения вашего первого события.Если при возникновении этого события проверьте, пересекаются ли ваши прямоугольники.Если это так, выполните все необходимые действия на этом этапе.

Как вы заметили, Thread.sleep() остановит выполнение всего потока, и больше ничего не произойдет.Это также сделает вашу анимацию нервной.

1 голос
/ 02 октября 2011

В игровом дизайне попробуйте сохранить логику в основном потоке (то есть я бы не использовал таймер). Я предлагаю следующее решение:

При обнаружении пересечения сохраняйте системное время в используя long intersectTime = System.currentTimeMillis() .

Теперь, во втором операторе if, просто проверьте наличие дополнительного условия. System.currentTimeMillis()-intersectTime>1000 с 1000 миллисекунд = 1 секунда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...