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