petter2012 Ответов: 1

Как зарегистрировать события от двух игроков в UWP?


Всем привет,

Я создаю игру в магазина. Я стараюсь иметь двух симулированных игроков с одной клавиатуры (скажем, один использует клавиши со стрелками, а другой-ASWD).

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

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

Спасибо!

Петтер

Что я уже пробовал:

Я пробовал событие KeyDown, но оно распознает только последнюю нажатую клавишу (как в текстовом процессоре).

1 Ответов

Рейтинг:
6

Sergey Alexandrovich Kryukov

Ваши предположения несостоятельны. Ничто не забывается по одной простой причине: именно вы делаете данные о событиях клавиатуры "запоминающимися". Основная архитектурная парадигма правильной обработки называется "диспетчеризацией". Все верно, ты справишься. KeyDown и может иногда понадобиться KeyUp, и вам никогда не понадобится KeyPress если вам не нужно обрабатывать процесс ввода текста, скажем, фильтровать его.

Вам нужен слой, который обрабатывает «строковое» событие клавиатуры и анализирует его. Он находится между элементом управления, обрабатывающим событие, и «виртуальными» элементами игры, такими как игроки. Плеер должен быть способен к некоторым "семантическим" событиям, таким как логическое "лево", "право", "лево-вверх" и так далее. Класс игрока может определить свой собственный экземпляр события со своим собственным типом аргумента события, и приведенные выше значения могут быть, скажем, вектором направления или даже типом перечисления. Он также должен обеспечивать механизм принятия событий, который внутренне вызывает эти вторичные, «семантические» события. Промежуточный уровень определяет, какой экземпляр игрока должен вызывать какое вторичное событие. Так же решает проблему диагональных клавиш. Это достаточно просто: он должен отслеживать нажатые в данный момент клавиши из соответствующего набора клавиш (и поэтому вам также нужноKeyDown Тогда, например, событие обнаружения нажатия кнопки Up зависит от состояния клавиш Left и Right. В зависимости от этих состояний Up интерпретируется как вторичное событие Up, LeftUp или RightUp.

Все это довольно просто, но вам нужно тщательно все продумать.

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

—СА


petter2012

Большое спасибо, что нашли время написать такой подробный ответ. В моем случае это всего лишь одностраничная игра, поэтому работать таким образом будет гораздо сложнее, чем просто использовать другой обработчик событий или что-то в этом роде. Мне нужно сесть и подумать, как мне поступить...
Спасибо снова.

Sergey Alexandrovich Kryukov

Добро пожаловать.
Соглашаться. И одной из причин абстрагирования даже входных данных из игры может быть возможность переноса игры в мультикомпьютерную программу. Тогда у вас будет слой с режимом игровых данных, игровой логикой, а вход и выход будут разделены на разные машины.
—СА