Я работаю над программированием игры Тетрис на Visual C # 2005. Это самая обширная программа, которую я когда-либо создавал.
Я создаю класс формы и класс блока для управления расположением, перемещением и отображением различных элементов тетриса. У меня есть функции moveDown (), moveLeft () и moveRight () для каждой формы (и соответствующие логические функции canMoveDown (), canMoveLeft (), canMoveRight (), которые проверяют, можно ли двигаться). Все это прекрасно работает.
Я хочу использовать клавиши со стрелками вниз, вправо и влево, чтобы позволить пользователю перемещать блок, в дополнение к использованию таймера, чтобы форма автоматически опускалась на одну строку каждые столько миллисекунд.
Я использую обработчик событий KeyDown, чтобы проверить, когда пользователь нажимает клавишу со стрелкой вниз, влево и вправо. Это не так уж и сложно. Проблема в том, что я хочу разрешить диагональное движение, и я хочу, чтобы оно работало как можно более плавно. Я пробовал кучу разных способов решения этой проблемы с разным успехом. Но я не могу это понять ...
Мой самый успешный подход заключался в использовании трех логических переменных, чтобы отслеживать, когда удерживаются клавиши со стрелками вниз, влево и вправо. Я бы установил для логических значений true в событии KeyDown и false в событии KeyUp. В событии KeyDown я бы также сказал блоку, как перемещаться, используя логические переменные, чтобы проверить, какая комбинация была нажата в данный момент. Это сработало очень хорошо, за исключением одного момента.
Если бы я нажал одну из клавиш со стрелками и удерживал, затем нажал вторую клавишу со стрелкой, а затем отпустил вторую клавишу, блок полностью перестал бы двигаться, вместо того, чтобы продолжать движение в направлении первой клавиши со стрелкой, которая не была отпущена. пока что. Я думаю, это связано с тем, что второй ключ вызвал событие KeyDown, и после его выпуска событие KeyUp было запущено, а событие KeyDown перестало срабатывать полностью, даже если первый ключ запущен.
Я всю жизнь не могу найти удовлетворительного решения этой проблемы.
Любая помощь будет принята с благодарностью =)