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();
}
}
}
Спасибо за помощь
Рассмотрите возможность публикации [SSCCE] (http://sscce.org) для лучшей помощи. – nachokk
Нам было бы легче ответить на ваш вопрос, если бы вы показали нам важные части вашего игрового кода (точно, где и как вы ввели код ключевых привязок). –
Скорее всего, что-то происходит, это означает, что поток не выполняет его сразу, но код, который вы опубликовали здесь, в значительной степени не имеет значения - нам нужно будет увидеть SSCCE, чтобы помочь дальше. – berry120