2014-01-02 4 views
0

EDIT: Добавлен код из игры.Ключевые привязки в Java: Задержка после нажатия клавиши

У меня есть ключевые привязки для игры, над которой я работаю. Они должны перемещать объекты при нажатии клавиш.

(в настоящее время каждый println (..) представляет собой фактический код для перемещения вещей на экране, будет добавлен позже).

Печать в консоли работает, но с задержками. Слова «слева», «справа» и т. Д. Появляются с задержкой в ​​консоли, иногда с задержкой на половину секунды, иногда с задержкой в ​​несколько секунд.

Иногда нет задержек, но когда много клавиш нажимаются один за другим, происходит задержка в несколько секунд, и только тогда слова появляются на консоли (например, компьютер слишком много обрабатывал в то же время).

Когда я выполнил те же ключевые привязки в другом проекте без всякой логики игры, только нажав кнопки, которые печатают слова в консоли, - он работал совершенно безотлагательно.

Поэтому я подозреваю, что проблема связана с кодом игры или тем, как я использовал ключевые привязки внутри кода игры.

Как исправить это?

Я попытался поместить код ключевых привязок в поток, содержащий цикл игры (до игрового цикла) и в конструкторе. Та же проблема.

Вот соответствующий код класса Board (продолжение JPanel), основной JPanel игры, который отображает графику и управляет объектами.

import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class Board extends JPanel implements Runnable { 

    Tank tank1,tank2; 
    boolean[] keysPressed1,keysPressed2; 
    Action upAction,leftAction,rightAction,wAction,aAction,dAction; 
    InputMap inputMap; 
    ActionMap actionMap; 

    public Board(){ 

     setFocusable(true); 
     setBackground(Color.BLACK); 

     tank1 = new Tank("red"); 
     tank2 = new Tank("blue"); 

     inputMap = this.getInputMap(); 
     actionMap = this.getActionMap(); 

     Thread gameloop = new Thread(this); 
     gameloop.start(); 

    } 

    public void paintComponent(Graphics g){ 

     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 

     // Drawing tanks on the screen. 

    } 

    public void run(){ 

     // Key Bindings ////// 

     upAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("up"); 
      } 
     }; 

     leftAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("left"); 
      } 
     }; 

     rightAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("right"); 
      } 
     }; 

     wAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("w"); 
      } 
     }; 

     aAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("a"); 
      } 
     }; 

     dAction = new AbstractAction(){ 
      public void actionPerformed(ActionEvent e){ 
       System.out.println("d"); 
      } 
     }; 

     inputMap.put(KeyStroke.getKeyStroke("UP"),"upAction"); 
     inputMap.put(KeyStroke.getKeyStroke("LEFT"),"leftAction"); 
     inputMap.put(KeyStroke.getKeyStroke("RIGHT"),"rightAction"); 
     inputMap.put(KeyStroke.getKeyStroke("W"),"wAction"); 
     inputMap.put(KeyStroke.getKeyStroke("A"),"aAction"); 
     inputMap.put(KeyStroke.getKeyStroke("D"),"dAction"); 

     actionMap.put("upAction",upAction); 
     actionMap.put("leftAction",leftAction); 
     actionMap.put("rightAction",rightAction); 
     actionMap.put("wAction",wAction); 
     actionMap.put("aAction",aAction); 
     actionMap.put("dAction",dAction); 

      // End Key Bindings ////// 

      // Start of game loop. //// 

     int TICKS_PER_SECOND = 50; 
     int SKIP_TICKS = 1000/TICKS_PER_SECOND; 
     int MAX_FRAMESKIP = 10; 

     long next_game_tick = System.currentTimeMillis(); 
     int loops; 

     boolean game_is_running = true; 

     while(game_is_running) { 

      loops = 0; 
      while(System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) { 

        // Code to manipulate tank1. 
        // ....... 

       tank1.move(); 

        // Code to manipulate tank2. 
        // ....... 

       tank2.move(); 

       next_game_tick += SKIP_TICKS; 
       loops++; 
      } 

      repaint(); 
     } 

    } 
} 

Спасибо за помощь

+1

Рассмотрите возможность публикации [SSCCE] (http://sscce.org) для лучшей помощи. – nachokk

+1

Нам было бы легче ответить на ваш вопрос, если бы вы показали нам важные части вашего игрового кода (точно, где и как вы ввели код ключевых привязок). –

+0

Скорее всего, что-то происходит, это означает, что поток не выполняет его сразу, но код, который вы опубликовали здесь, в значительной степени не имеет значения - нам нужно будет увидеть SSCCE, чтобы помочь дальше. – berry120

ответ

1
  • Вы делаете много Свинг звонков от нити Качели событий или EDT. Если вы хотите быть осмотрительным (вы доверяете мне), не делайте этого.
  • Вы полагаетесь на ОС, чтобы выполнять повторяющиеся действия при удерживании клавиши, а поведение ОС - сначала приостановить до повторения.
  • Вам нужно запустить таймер поворота при нажатии клавиши и выключить его или изменить его состояние при поднятии клавиши. Вероятно, это решит вашу проблему.

Если это не поможет, попробуйте еще раз приложить усилия для создания и публикации sscce.

+0

Под «качающимися вызовами» вы подразумеваете любую команду, которая влияет на компонент Swing? Если это так, единственные «свинг-звонки», которые я нашел, следующие: setFocusable (true); setBackground (Цвет.ЧЕРНЫЙ); Есть ли еще? – user3150201

+0

Существует действительно встроенная задержка, о которой вы говорите, но не только это. Я отредактировал это в вопросе: «Иногда нет никакой задержки, но когда много клавиш нажимаются один за другим, есть задержка в несколько секунд, и только тогда слова появляются на консоли (например, на компьютере слишком много, чтобы справиться в одно и то же время). Это похоже на то, что программа требует слишком много компьютера, поэтому компьютер не может печатать слова «слева», «справа» и т. Д. без задержки. Любая идея, как это исправить? – user3150201

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