2014-04-17 1 views
0

저는 간단한 자바 게임을 만들고 있습니다. 3..2..1을 만들어야합니다 ... Go! "3", "2", "1"지정된 시간 동안 기다리십시오. java (Thread.sleep()이 아님)

public void paint321(Graphics g) { // <-- called from paintComponent(Graphics) 
    try { 
    int hei = this.getHeight(), wid = this.getWidth(); 
    g.drawString("3", (int)(wid/2), (int)(hei/2)); 
    Thread.sleep(1000); 
    g.drawString("2", (int)(wid/2), (int)(hei/2)); 
    Thread.sleep(1000); 
    g.drawString("1", (int)(wid/2), (int)(hei/2)); 
    Thread.sleep(1000); 
    g.drawString("Go!", (int)(wid/2)-6, (int)(hei/2)); 
    } 
    catch (InterruptedException ex) { ... 

그러나 게임의 GamePanel은 (내 패널 인 JPanel을 확장하고 JFrame의에) 3 초 동안 흰색 찾은 다음 내가 볼 : 내 코드는 다음과 같다 그리고 "가!" 서로에 갇혀있다.

스레드를 사용할 수 없지만 컴퓨터에 현재 스레드 (내 GamePanel, 내가 추측)를 표시하지 않기 때문에라고 생각합니다.

제 질문은 : Thread.sleep()을 사용하지 않고 specipied time (제 경우에는 1 초)을 어떻게 대기시킬 수 있습니까? 또는 흰색 패널이 표시되는 이유에 대한 설명을 제공하십시오.

+0

이 메소드를 호출 한 후 무엇을해야합니까? – Eugene

+0

@Eugene 아무 것도 붙어 있지 않은 단어를보고 나서 프로그램을 닫습니다. – maxpesa

답변

2

당신은 사용해야 java.util.Timer (또는 javax.swing.Timer) :

public void paint321(Graphics g) { 
    int hei = this.getHeight(), wid = this.getWidth(); 

    java.util.Timer timer = new java.util.Timer(); 
    timer.schedule(new TimerTask() { 
     private int counter = 3; 

     @Override 
     public void run() {    
      if (counter > 0) { 
       g.drawString(String.valueOf(counter), wid/2, hei/2); 
      } else { 
       g.drawString("Via!", wid/2 - 6, hei/2); 
       timer.cancel(); 
      } 

      counter--; 
     } 
    }, 0L, 1000L); 
} 
+0

매우 완전한 대답입니다. 사용이 더 정확합니까? g.drawString (String.valueOf (counter), wid/2, hei/2); 또는 g.drawString (String.valueOf (counter), (int) (wid/2), (int) (hei/2))); ? 자동으로 캐스트됩니까? – maxpesa

+0

@maxpesa g.drawString에 두 가지 오버로드가 있습니다. 하나는 float이고 하나는 int입니다. – AlanFoster

+0

@AlanFoster 픽셀이 int로 표시되지 않습니까? – maxpesa

0

여러 가지 중요한 이벤트를 올바르게 처리하지 못하도록하는 단일 GUI 스레드에서 잠을 듭니다. 가능한 유일한 솔루션은 멀티 스레딩입니다.

+0

멀티 스레딩에 대해 배우려고합니다.하지만이 작업을 수행하는 간단한 방법이 없다는 것이 이상하다고 생각합니다. – maxpesa

2

Thread.sleep을 사용하면 해당 스레드를 차단 했으므로 JFrame/JPanel의 업데이트가 차단됩니다.

간단한 해결책을 위해 Java 타이머를 사용할 수 있습니다.

그러나 게임 루프 메카닉을 사용하는 경우 게임을 제작할 때 가장 많이 사용하게 될 것입니다. 시작한 시간을 간단하게 추적하고 초기 숫자를 가져올 수 있으며, 그 시간 이후로 1 초가 경과하면 다음 숫자를 그립니다.

관련 문제