2012-07-01 3 views
0

Simon game을 만들려고합니다. 게임을 프로그래밍하는 중반이지만 문제가 있습니다. 이전에 게임에 있던 모든 값을 QUEUE에서 읽은 다음 올바른 순서로 색상을 깜박 거리게하고 싶습니다 (회색으로 바꾸고 두 번째로 정상으로 되돌리기로 결정했습니다). 이것이 내 문제입니다. play() 메서드를 보면 거기에 쓴 주석이 표시됩니다. 어떻게해야합니까?두 줄의 코드 지연 - 그래픽

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.geom.Arc2D; 
import java.util.Date; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

import unit4.collectionsLib.Queue; 

public class window extends JPanel implements MouseListener , ActionListener{ 

    Queue <Integer>data = new Queue<Integer>(); 
    Queue <Integer>temp = new Queue<Integer>(); 
    int random; 
    Timer prestart; 
    int prestartcount; 
    Color [] colors = {Color.red,Color.blue,Color.yellow,Color.green}; 

    public window(){  
     prestart = new Timer (1000,this); 
     int prestartcount=0;  
     prestart.start();  
    } 

    public void play(){    
     random = (int)(Math.random()*4); 
     data.insert(random); 

     int x=0; 
     Color temp=Color.black; 
     x = data.remove(); 
     this.temp.insert(x); 
      temp = colors[x]; 
     colors[x]=Color.gray; 
     // delay of one second here 
     colors[x]=temp; 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.setColor(colors[0]); 
     g.fillArc(80, 150, 250, 250, 0, 360); 

     g.setColor(colors[1]); 
     g.fillArc(80, 150, 250, 250, 0, 270); 

     g.setColor(colors[2]); 
     g.fillArc(80, 150, 250, 250, 0, 180); 

     g.setColor(colors[3]); 
     g.fillArc(80, 150, 250, 250, 0, 90);   

     g.drawString(prestartcount+"", 0, 30); 
     repaint(); 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     arg0.getLocationOnScreen();  
    } 

    @Override 
    public void mouseEntered(MouseEvent arg0) { 
    } 


    @Override 
    public void mouseExited(MouseEvent arg0) {  
    } 


    @Override 
    public void mousePressed(MouseEvent arg0) {  
    } 


    @Override 
    public void mouseReleased(MouseEvent arg0) { 
    } 


    @Override 
    public void actionPerformed(ActionEvent act) { 
     if (act.getSource()==prestart){ 
      if (prestartcount<3) 
       prestartcount++; 
      else{ 
       prestart.stop(); 
       play(); 
       }    
      } 
     } 
} 
+0

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 테스트 코드에서도 수업에 의미있는 이름을 사용하십시오. 'SimonGameTest'와 같은 것이 이것에 적절할 수도 있습니다. 3) 클래스에 대한 일반적인 [Java 명명 규칙 (Java 命名 規則)] (http://java.sun.com/docs/books/books/books/jls/second_edition/html/names.doc.html#73307) (특히 이름에 사용 된 사례)을 배우십시오. , 메소드 및 속성 이름 및 일관되게 사용하십시오. 4) 코드 블록에 일관성 있고 논리적 인 들여 쓰기를 사용하십시오. –

답변

0

Thread.sleep()를 사용해보십시오 :

이 내 코드입니다.

Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds. The thread does not lose ownership of any monitors. 
0

Thread.sleep(1000)이 필요합니다.

+1

이렇게하면 응용 프로그램이 1 초 동안 고정됩니다. – Ishtar

+0

@Ishtar No, EDT가 아닌 Timer로부터'Play()'메서드가 호출됩니다. – GETah

+1

EDT에서 실행되는'swing.Timer'입니다. EDT를 차단합니다. – Ishtar

1
colors[x]=Color.gray; 
// delay of one second here 
timer = new Timer(0, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     colors[x]=temp; 
     repaint(); //repaint the gui, or you want see the effect 
    } 
}); 
timer.setInitialDelay(1000); //wait one second 
timer.setRepeats(false); //only once 
timer.start(); 

임시 결승을해야하거나 다른 곳에 저장할 수도 있습니다.