2015-06-09 90 views
-2

我認爲我的問題是在我的延遲方法。我的遊戲首先應該有一個綠色的按鈕,隨機會變成紅色。如果用戶按下這個紅色按鈕,他們會失去。我的代碼沒有檢測到紅色按鈕被點擊時,我認爲是因爲我的延遲方法。但最終它會在多次顯示紅色按鈕後檢測到它。請幫忙!!運行我的代碼,看看有什麼不對,請告訴我如何解決它! (對於按鈕的圖像是在它們應該是什麼樣的標題非常自我解釋)有人可以幫我用我的按鈕遊戲代碼?

import java.awt.*; 
import java.awt.event.*; 
import java.applet.*; 
import java.applet.Applet; 
import java.awt.image.*; 
import java.util.*; 
import java.net.*; 

public class pages extends Applet 
{ 
    int numClicks; 
    boolean isGreen; 
    boolean isClicked; 
    boolean ClickedDuringDelay; 
    int count; 
    int rand; 
    int buttonCode;   
    public void init() 
    { 
    numClicks = 0; 
    buttonCode = 0; 
    count = 0; 
    ClickedDuringDelay = false; 


    } 

    public void paint(Graphics g) 
    { 

      //screens 
      switch(numClicks) 
      { 
       case 0: StartPage(g); break; 
       case 1: InstrucPage(g); break; 
       case 2: GamePage(g); break; 
      } 

      //pushing buttons 
      if(numClicks >1) 
      { 
       if(rand >= 80) 
        isGreen = false; 
       else 
        isGreen = true; 

       Image button; 
         if (isClicked && isGreen)          
          {button = getImage(getDocumentBase(), "greenpressed.png"); //green pressed 
         g.drawImage(button,200,150,this);} 
        else if(!isGreen) 
         {button = getImage(getDocumentBase(), "red.png");   //red unpressed 
         g.drawImage(button,200,150,this); 

         ClickedDuringDelay = delay(); 
         if(ClickedDuringDelay) 
          LosePage(g); 
         else{ 
          button = getImage(getDocumentBase(), "green.png"); 
          g.drawImage(button,200,150,this); 
          rand = (int)(Math.random() * 100); 
          repaint(); } 
         } 
      } 




    } 

    public boolean mouseDown(Event e, int x, int y) 
    { 

    if(!ClickedDuringDelay){ 
     if(numClicks <2) 
      {numClicks++; count--;} 
      isClicked = true; 
      repaint(); 
     count++;} 

     return true; 

    } 

    public boolean mouseUp(Event e, int x, int y) 
    { 
    rand = (int)(Math.random() * 100); 
    //System.out.println(rand); 

    if(!ClickedDuringDelay){ 
      isClicked = false; 
     repaint();} 
     return true; 
    } 

    public void StartPage(Graphics g) 
    {  //background 
     g.setColor(Color.black); 
     g.fillRect(0,0,800,600); 

     //Title 
     g.setColor(Color.white); 
     g.setFont(new Font("Desdemona",Font.BOLD,100)); 
     g.drawString("DO NOT PRESS THE",20,100); 

     g.setColor(Color.red); 
     g.setFont(new Font("Braggadocio",Font.BOLD,100)); 
     g.drawString("RED",250,250); 
     g.drawString("BUTTON",120,350); 

     g.setColor(Color.white); 
     //g.drawRect(200,400,400,100); 
     g.setFont(new Font("American Typewriter",Font.PLAIN,50)); 
     g.drawString("Click anywhere to continue..",60,490); 
    } 

    public void InstrucPage(Graphics g) 
    { 
     //background 
     g.setColor(Color.black); 
     g.fillRect(0,0,800,600); 

     //title 
     g.setColor(Color.white); 
     g.setFont(new Font("Desdemona",Font.BOLD,100)); 
     g.drawString("Instructions",100,100); 

     g.setColor(Color.red); 

     g.setFont(new Font("American Typewriter",Font.PLAIN,40)); 
     g.drawString("A green button will first appear.",70,200); 
     g.drawString("You MAY click this button.",130,250); 
     g.drawString("A red button will randomly appear.",70,300); 
     g.drawString("Do NOT press this button.",130,350); 

     g.setColor(Color.white); 
     g.setFont(new Font("American Typewriter",Font.PLAIN,50)); 
     g.drawString("Click anywhere to start!", 95, 520); 
    } 

    public void GamePage(Graphics g) 
    { 
     //background 
     g.setColor(Color.black); 
     g.fillRect(0,0,800,600); 

     //score 
     g.setColor(Color.white); 
     g.setFont(new Font("Arial",Font.BOLD,100)); 
     g.drawString("SCORE: " + count,150,100); 

     //button 

     Image buttons = getImage(getDocumentBase(), "green.png"); 
     g.drawImage(buttons,200,150,this); 



    } 


    public void LosePage(Graphics g) 
    { 
     //background 
     g.setColor(Color.black); 
     g.fillRect(0,0,800,600); 

     g.setColor(Color.red); 
     g.setFont(new Font("Desdemona",Font.BOLD,250)); 
     g.drawString("YOU",200,220); 
     g.drawString("LOST",150,470); 

     g.setColor(Color.white); 
     g.setFont(new Font("American Typewriter",Font.PLAIN,50)); 
     g.drawString("Your final score was " + count, 140, 540); 

    } 

    public boolean delay() 
    { 
    boolean delayClick = false; 

    for (int i = 0; i<200;i++) 
    { 
     try 
     { 
      Thread.sleep(5); 
      if (isClicked) 
      {delayClick = true; 
      System.out.println("pressed");} 

     } 
     catch(InterruptedException ex) 
     { 
      Thread.currentThread().interrupt(); 
     } 

    } 
    return delayClick; 


    } 

}

回答

2

你正在做的幾件事錯在這裏。

首先,你永遠不應該從EDT調用Thread.sleep()。這將導致你所描述的行爲:你的用戶界面將變得遲鈍而且沒有反應。你可以谷歌「Java EDT」獲取更多信息,但this是一個合理的起點。

而不是(錯)使用Thread.sleep()來檢測延遲,你可能想要使用擺動計時器。更多的信息可以在here找到。

其次,您不應該從EDT加載圖像。相反,在開始時加載它們一次。

除此之外:您最好使用JPanel(Swing代替AWT),並且您應該確實修復您的格式,因爲您的代碼很難原樣閱讀!

+0

那麼我會在我的延遲方法中使用擺動計時器嗎?對於代碼可讀性抱歉,這是我在AP CS編程的第一年,但我正在盡我所能! –

+0

@JillyPenfield不用擔心,我們都是以不可讀的代碼開始的。我剛剛提到它,因爲它可以幫助您進行調試。至於你會在哪裏使用你的Swing Timer,這真的取決於。你想要什麼時候開始計時器?你想什麼時候結束?當它結束時你想要發生什麼? –

+0

我希望我的swing定時器在我的按鈕變爲紅色後啓動(這是在paint方法中的else-if語句中)。我想讓按鈕保持紅色大約5秒鐘。當計時器結束時,我需要按鈕變回綠色。但是,如果在搖擺計時器(當按鈕紅色5秒鐘),如果用戶點擊,我需要圖片repressed.png來顯示,然後丟失屏幕 –

相關問題