Я сделал змеиную игру в 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 #, поэтому я, вероятно, слишком усложнил многие вещи!