Клавиши со стрелками, вызывающие огромную задержку в игре WPF - PullRequest
0 голосов
/ 13 ноября 2018

Я сделал змеиную игру в WPF, которая отлично работает с использованием WASD, но когда я использую вместо этого клавиши со стрелками, используя точно такой же код, она задерживается на 5 секунд после каждого нажатия клавиши.

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

Код, который я использую для ввода клавиш, приведен ниже:

    private void Window_KeyDown(object sender, KeyEventArgs e) {    // Window_KeyDown is called every time the user presses a key. If the key is one of W, A, S, D, Up, Down, Left, Right (movement direction) or Space (play/pause), it will call the relevant functions.
        if (gameStateBools.isInGame && !gameStateBools.isPaused) {
            switch (e.Key) {
                case (Key.Space):    // Space "Clicks" the playPauseButton.
                    playPauseButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
                    break;
                case (Key.W):    // W changes the pendingDirection to move up.
                    if (gameState.direction != 1) {
                        pending.pendingDirection = 0;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.S):    // S changes the pendingDirection to move down.
                    if (gameState.direction != 0) {
                        pending.pendingDirection = 1;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.A):    // A changes the pendingDirection to move left.
                    if (gameState.direction != 3) {
                        pending.pendingDirection = 2;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.D):    // D changes the pendingDirection to move right.
                    if (gameState.direction != 2) {
                        pending.pendingDirection = 3;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.Up):    // Up changes the pendingDirection to move up.
                    if (gameState.direction != 1) {
                        pending.pendingDirection = 0;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.Down):    // Down changes the pendingDirection to move down.
                    if (gameState.direction != 0) {
                        pending.pendingDirection = 1;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.Left):    // Left changes the pendingDirection to move left.
                    if (gameState.direction != 3) {
                        pending.pendingDirection = 2;
                        ArrowFromDirection();
                    }
                    break;
                case (Key.Right):    // Right changes the pendingDirection to move right.
                    if (gameState.direction != 2) {
                        pending.pendingDirection = 3;
                        ArrowFromDirection();
                    }
                    break;
            }
        }
    }

РЕДАКТИРОВАТЬ: я открыл исходный код проекта теперь, когда он исправлен :) https://github.com/jacobcxdev/UTC-Snake. Обратите внимание, что это мой первый проект на C #, поэтому я, вероятно, слишком усложнил многие вещи!

1 Ответ

0 голосов
/ 13 ноября 2018

Установить e.Handled = true во всех случаях.

Клавиши со стрелками имеют функцию в структуре WPF (позиционирование, изменение размера).Если вы указываете, что ваш пользовательский код обработал их, они больше не перенаправляются в оконную инфраструктуру, которая, очевидно, требует времени для их обработки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...