Обработка ввода полностью прерывается, когда одновременно удерживается более одной клавиши - PullRequest
1 голос
/ 16 марта 2019

У меня есть некоторые подозрения относительно того, как я обрабатываю переменную 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.Тем не менее, я до сих пор не могу понять проблему с этим ...

...