У меня есть некоторые подозрения относительно того, как я обрабатываю переменную heldKeys
(добавляя и удаляя из нее keycodes
).
Все работает отлично, когда одновременно нажимается только одна клавиша (и поэтому я считаю, что проблема в этом классе, а не в тех, которые занимаются рисованием или обновлением).Тем не менее, все полностью ломается, когда я нажимаю более одной клавиши одновременно.
При «ломается» больше не работает должным образом: нажатие вверх иногда перемещает всех подписчиков вверх, в других случаях перемещает того, который должен двигатьсявверх, а другие вниз и т. д. В других случаях определенное действие перестает делать что-либо, пока я не перезапущу программу.
Я пытался отладить и увидеть эволюцию массива heldKeys
, но у меня действительно естьне знаю, в чем проблема.
Код:
<code>
public class MainInputProcessor implements InputProcessor {
// REFERENCE:
// <Listener, <ACTION, KEYCODE>>
private Array<ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>> racketMovementListeners;
// Stores the keys that are held down
private IntArray heldKeys;
// Initialisation
public MainInputProcessor() {
heldKeys = new IntArray();
racketMovementListeners = new Array<ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>>();
}
// Adds a RacketMovementListener to the respective subscriber list
public void subscribeToRacketMovement(RacketMovementListener newSubscriber, ObjectMap<Racket.ACTIONS, Integer> movementKeys) {
ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>> map = new ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>>();
map.put(newSubscriber, movementKeys);
racketMovementListeners.add(map);
}
// Update and execute event action
public void updateEvents() {
// Fire events for racket movement subscribers if the keys match
if (!heldKeys.isEmpty()) {
for (ObjectMap<RacketMovementListener, ObjectMap<Racket.ACTIONS, Integer>> map : racketMovementListeners) {
for (RacketMovementListener listener : map.keys()) {
for (Integer keycode : heldKeys.items) {
if (map.get(listener).get(Racket.ACTIONS.MOVE_DOWN).equals(keycode)) {
listener.moveDownPressed(listener);
} if (map.get(listener).get(Racket.ACTIONS.MOVE_UP).equals(keycode)) {
listener.moveUpPressed(listener);
}
}
}
}
}
}
@Override
public boolean keyDown(int keycode) {
// Add keycode to heldKeys if it's not already there
if (!heldKeys.contains(keycode)) {
heldKeys.add(keycode);
return true;
}
return false;
}
@Override
public boolean keyUp(int keycode) {
// Remove keycode from heldKeys since the key is no longer held down
for (Integer code : heldKeys.items) {
if (code == keycode) {
heldKeys.removeValue(code);
}
}
return true;
}
</code>
Я на самом деле не ищу решения или исправленный код, просто какая-то отправная точка или где-то искать, потому что я недаже знаю с чего начать.Я думал о переписывании этого, но думаю, что я сделал бы те же ошибки.
Для контекста, это код для клона Pong, в LibGDX.
UPDATE
Я переписал весь менеджер ввода так, чтобы он делал то же самое, но с использованием инструкций switch и в целом проще, но остается та же проблема.
Теперь я уверен, что проблема в том, как я обрабатываю массив heldKeys
.Тем не менее, я до сих пор не могу понять проблему с этим ...