2015-06-09 4 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

Вы делаете кое-что здесь не так.

Прежде всего, вы никогда не должны звонить Thread.sleep() с EDT. Это приведет к точному поведению, которое вы описываете: ваш пользовательский интерфейс станет слабым и невосприимчивым. Вы можете google «Java EDT» за тонну дополнительной информации, но this является разумной отправной точкой.

Вместо (неверно) с использованием Thread.sleep(), чтобы обнаружить задержку, вы, вероятно, захотите использовать таймер Swing. Более подробную информацию об этом можно найти here.

Во-вторых, вы не должны загружать изображения с EDT. Вместо этого загрузите их один раз в начале.

Кроме этого: вам, вероятно, будет лучше использовать JPanel (Swing вместо AWT), и вы должны действительно исправить свое форматирование, так как ваш код очень трудно читать как есть!

+0

Так я бы просто использовал таймер качания в методе задержки? извините за читаемость кода, это мой первый год когда-либо кодирования в AP CS, но я стараюсь изо всех сил! –

+0

@JillyPenfield Не беспокойтесь, мы все начинаем с нечитаемого кода. Я только что упомянул об этом, потому что это поможет вам с отладкой, когда вы продолжаете. Что касается того, где вы будете использовать свой таймер Swing, это действительно зависит. Когда вы хотите запустить таймер? Когда вы хотите, чтобы это закончилось? Что вы хотите, когда закончите? –

+0

Я бы хотел, чтобы мой таймер разворота начинался после того, как моя кнопка стала красной (это в инструкции else-if в методе рисования). Я хочу, чтобы кнопка оставалась красной примерно на 5 секунд. Когда таймер заканчивается, мне нужна кнопка, чтобы вернуться к зеленому. ОДНАКО, если во время таймера качания (когда кнопка красная в течение 5 секунд), если пользователь нажимает, мне нужно изображение repressed.png, чтобы показать, а затем проиграть экран –

 Смежные вопросы

  • Нет связанных вопросов^_^