2012-05-12 5 views
1

나는 Swing을 AI로 사용하여 간단한 보드 게임을 만들고있다. AI가 차례대로 이동하도록 허용하기 전에 약 3 초 동안 게임을 "일시 중지"하여 사용자가 이동 결과를 볼 수있게하고 싶습니다. Thread.sleep (3000)을 호출하면 Trident Animation Library를 사용하여 만든 애니메이션이 일시 중지됩니다. 3 초가 지나면 공백이 원래 있던 색상으로 바뀌고 애니메이션은 전혀 수행되지 않습니다.자바 트라이던트 라이브러리 및 Thread.sleep()

누구든지 조언을 제공 할 수 있다면 알려주세요. 나는 항상 AI가 턴을 시작하기 전에 사용자가 누를 수있는 "Continue"버튼을 추가 할 수 있지만, 나는 그 단계를 피하고 싶습니다.

편집 : 여기 내 싱글 플레이어 패널이 있습니다. 현재의 보드를 기반으로 GUI를 업데이트 할 수있는 추상 클래스 인 GamePanel을 확장합니다. 또한 JPanel을 확장합니다. 나는 그것이 내가이 클래스 또는 다른 클래스에 있는지 여부에 관계없이 내가 원하는 것을하기 위해 타이머를 구현하는 곳/방법에 관해서는 조금 불분명하다고 생각한다.

답변

1

어쨌든 별도의 스레드에서 AI 코드를 실행하는 가정 (당신이 잠 그려는 않을 것이다 복잡한 AI 작업을 실행하는 동안 UI가 필요합니까?), UI 스레드가 아닌 AI 스레드에서 일시 중지를 원합니다. 거기에 Thread.sleep()을 추가하십시오.

현재 AI 용으로 별도의 스레드를 사용하지 않고 의도 한 것보다 '단순하지'않은 소리가 들리면 Futures and Callables을 사용하여 배경 작업을 수행하고 발생하는 이벤트를 연결하는 좋은 방법을 살펴보십시오. 그들이 완료되면.

+1

더 나은 대답입니다. 1 + –

+0

왜 고마워요 :) –

+0

또한이 솔루션을 사용하여 내 Player 클래스가 Runnable을 구현하고 run()을 재정의했습니다. 내 ComputerPlayer 클래스 내에서 Thread.sleep()을 호출했지만 애니메이션은 여전히 ​​일시 중지 된 다음 색상이 변경됩니다. 정확히 내가 뭘 잘못하고 있는지 모르겠습니다. 잠시 후에 코드를 업데이트하겠습니다. – Cuthbert

4

스윙 이벤트 스레드 또는 EDT에 절대로 Thread.sleep()을 호출하면 Swing이 그래픽을 수행하거나 사용자와 상호 작용하지 못하도록이 스레드를 연결하므로 절대로 호출하지 마십시오. 대신 Swing Timer을 사용하십시오. 예를 들어, 스윙 이벤트 발송 쓰레드 또는 EDT에 대한 자세한 내용은

int delay = 3000; 
    new Timer(delay , new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // tell AI to do its thing 
     ((Timer)e.getSource()).stop(); 
    } 
    }).start(); 

은 참조하시기 바랍니다 : Concurrency in Swing

+0

원본 코드를 일부 코드로 업데이트했습니다. 나는 타이머를 추가하는 방법에 대해 조금 확신 할 수 없다고 생각한다. – Cuthbert

+0

@ d2jxp : 진부하지 말고 지연을 원하는 곳에 추가하십시오. 실험. –

+0

Not trite :-P 나는 그걸로 어지럽게되었습니다. AI가 움직이기 전에 애니메이션을 끝내야 할 것 같습니다. 그게 다야. – Cuthbert