2012-07-01 38 views
0

我試圖做一個Simon game。 我是編程遊戲的中途,但我遇到了問題。 我希望程序從隊列以前一直在遊戲中,並打開所有值閃爍的顏色以正確的順序讀取(我選擇把他們的灰色和秒鐘後恢復正常),這是我的問題。如果你看看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命名約定](http://java.sun.com/docs/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不,從播放器調用'Play()'方法不是EDT :) – GETah

+1

這是一個'swing.Timer',運行在EDT中,所以它會阻止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(); 

您可能需要製作temp final,或將其存儲在其他地方。