2010-04-06 4 views
2

Я пишу клон Tetris в WPF. Если я удерживаю клавишу со стрелкой вправо, текущая часть сдвигается вправо. Для игрового режима я хочу разрешить пользователю нажимать еще одну клавишу (то есть F-ключ) и вращать движущуюся часть , не отпуская правой клавиши со стрелкой в ​​начале. В настоящее время, когда я это делаю, кусок перестает меняться.Несколько ввода с клавиатуры C# WPF

Моя первая основная попытка это закреплять в

Window_PreviewKeyDown(object sender, KeyEventArgs e) 

и затем отправить сообщение на уровне контроллера.

Как я могу создать свой код ввода-прослушивания, чтобы это разрешить?

Мой текущий код Here

ответ

2

Должно существовать событие KeyUp, а также используя KeyDown и KeyUp, вы можете достичь эффекта, который вы ищете. Это можно сделать несколькими способами.

Можно было бы позволить вашему событию KeyDown инициировать повторяющееся действие и позволить KeyUp отменить его.

Другим было бы сохранение того, удерживаются ли определенные ключи. Сохраните список ключей и включите их, когда KeyDown и выключите KeyUp. В основной петле игр вы будете запускать события, соответствующие всем оставшимся клавишам.

Пример:

bool[] heldDown = new bool[256]; // One index for the keycode of each key 

void Window_PreviewKeyDown(object sender, KeyEventArgs e) { 
    heldDown[e.KeyCode] = true; 
}  
void Window_PreviewKeyUp(object sender, KeyEventArgs e) { 
    heldDown[e.KeyCode] = false; 
}  

А потом пройти через «heldDown» в основных цикла и пожаров для каждого осмысленного ключа, который проходит вниз:

if (heldDown[Key.F]) 
    MainController.TriggerPieceEvent(Constants.PieceEvents.RotateClockwise); 
if (heldDown[Key.Left]) 
    MainController.TriggerPieceEvent(Constants.PieceEvents.ShiftLeft); 
// etc... 
+0

C++ - массив стилей: P – Alex

+0

О, правильно :) После C, всегда C Я полагаю. – Jakob

1

Windows, будет только повторить события для последнего ключа нажата вниз. Кроме того, задержка перед тем, как ключ повторяется первым, а также скорость, которую он повторяет, зависит от настроек, которые обычно оптимизируются для ввода, а не для игр. Поэтому для игр лучше всего игнорировать их и иметь собственный способ реализовать «повторяющиеся» ключи.

В основном вам нужно будет сохранять состояния (нажатые или отпускаемые) интересующие вас клавиши и изменять их, когда вы получаете событие KeyDown или KeyUp. Затем, в каком-то таймере, вам нужно будет проверить состояния и события огня для каждого ключа, который в данный момент не работает. Если этот таймер происходит на уровне контроллера или в пользовательском интерфейсе, зависит от вашей архитектуры. :-)

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

1

Вам нужны государства. Создайте такие переменные, как «RightArrowPressed» и «RotateButtonPressed»

в Key_Down проверьте нажатие клавиши, если это так, установите для соответствующей переменной значение true.

В key_up выполните то же самое, но установите для них значение false.

Теперь в любой момент вы можете посмотреть на две переменные и посмотреть, какая из клавиш нажата.

3

Вы полагаетесь на автоматическое повторение ключа, чтобы сохранить перемещение куска.Это не подходит, задержка повторения клавиатуры пользователя является переменной и будет влиять на игру игры. И, как вы узнали, он останавливает авто-повторение при нажатии другой клавиши.

Исправить это, предоставив каждому игровому объекту статус движения. Используйте событие KeyDown, чтобы изменить его. И событие KeyUp для его сброса, если значение статуса движения по-прежнему совпадает с ключом. В игровом цикле обновите позиции игрового объекта на основе их состояния движения. Вы сделали бы это с фиксированной скоростью, вызванной таймером.

Состояние движения также должно указывать на «падение». Теперь вы можете просто сделать игру более сложной, так как уровни будут достигнуты за счет уменьшения скорости таймера. Куски падают быстрее. И клавиатура становится более отзывчивой, давая пользователю возможность по-прежнему завоевать уровень.

Смежные вопросы