2015-04-20 2 views
0

Я пишу класс для перемещения круга по экрану, но основная проблема заключается в том, что логические переменные не изменяются на true, несмотря на мои попытки сделать их изменяющимися на true. Я не знаю, что я делаю неправильно. Пожалуйста помоги. Благодарю.Булевы переменные, не изменяющиеся на true

public class Restart extends Panel implements KeyListener { 

    static final int left = 37; 
    static final int right = 39; 
    static final int down = 40; 
    static final int up = 38; 

    static boolean leftPress = false; 
    static boolean rightPress = false; 
    static boolean upPress = false; 
    static boolean downPress = false; 

    static int x1 = 0; 
    static int y1 = 0; 

    Restart(int width, int length, int minusBy) { 
     super(width, length, minusBy); 
    } 

    public static void main(String args[]) throws InterruptedException { 
     Restart panel = new Restart(500, 500, 9); 
     JFrame frame = new JFrame("Fishy"); 
     frame.add(panel); 
     Frame.showFrame(frame); 

     while (true) { 

      if (upPress) { 
       y1--; 
      } 
      if (downPress) { 
       y1++; 
      } 
      if (leftPress) { 
       x1--; 
      } 
      if (rightPress) { 
       x1++; 
      } 

      Thread.sleep(1); 
      frame.repaint(); 
     } 
    } 

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

     g.fillOval(x1, y1, 50, 50); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     if (up == e.getKeyCode()) { 
      upPress = true; 
     } 
     if (down == e.getKeyCode()) { 
      downPress = true; 
     } 
     if (left == e.getKeyCode()) { 
      leftPress = true; 
     } 
     if (right == e.getKeyCode()) { 
      rightPress = true; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

     if (up == e.getKeyCode()) { 
      upPress = false; 
     } 
     if (down == e.getKeyCode()) { 
      downPress = false; 
     } 
     if (left == e.getKeyCode()) { 
      leftPress = false; 
     } 
     if (right == e.getKeyCode()) { 
      rightPress = false; 
     } 
    } 

    /* NOT USING */ 
    @Override 
    public void keyTyped(KeyEvent e) { 
    } 
} 
+0

Используйте привязки клавиш над 'KeyListener', чтобы преодолеть все связанные с этим проблемы с помощью KeyListener. См. [Как использовать привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

+0

О, и если вы не используете «BufferStrategy», я бы также рекомендовал используя библиотеку Swing над библиотекой AWT ... – MadProgrammer

ответ

0

Вы никогда не добавляете ключ-ключ к любому компоненту. Таким образом, вы не получите никакого ввода. Добавьте перезапуск в качестве ключевого исполнителя в некоторый Component (JPanel, а некоторые другие, возможно, необходимо сделать сфокусированным с помощью setFocusable(true)), позвонив по номеру someComponent.addKeyListener(this). Я бы рекомендовал добавить слушателя к самому экземпляру Restart.

+0

О, это. Благодарю. Кстати, я думал, что keylistener спит ровно 33 миллисекунды, когда вы держите его один раз, но класс не спит за 33 миллисекунды? Ты знаешь почему? – wolfpupxd

+0

Что именно вы подразумеваете под словом «когда вы держите его один раз»? – Paul

+0

@wolfpupxd Это общая задержка, генерируемая ОС, которая задерживает время между первым нажатием клавиши и повторением нажатия клавиш. Как правило, вы должны поднять флаг, указывающий, какая клавиша в данный момент нажата, и использовать какой-то цикл обновления для обработки логики, основанной на том, какие ключи в настоящее время отмечены. – MadProgrammer

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