Какой самый распространенный способ обработки щелчков мыши в играх?
Учитывая, что все, что у вас есть в способе обнаружения ввода от мыши - это кнопка вверх или вниз.
В настоящее время я просто полагаюсь на то, что мышь нажата, но этот простой подход сильно ограничивает меня в том, чего я хочу достичь. Например, у меня есть некоторый код, который должен запускаться только один раз при щелчке мыши, но использование мыши в качестве щелчка мыши может привести к тому, что код будет выполняться более одного раза в зависимости от того, как долго удерживается кнопка. Поэтому мне нужно сделать это одним кликом!
Но как лучше всего справиться с кликом? Это щелчок, когда мышь перемещается от мыши вверх-вниз или вниз-вверх, или это щелчок, если кнопка была нажата менее чем на x кадров / миллисекунд, а затем, если да, считается ли она мышью нажатой, а щелчок - если она нажата для х кадров / миллисекунд или щелчок мышью вниз?
Я вижу, что у каждого из подходов могут быть свои применения, но какой из них наиболее распространен в играх? А может быть, я спрошу более конкретно, что является наиболее распространенным в играх RTS?
Ответы:
Вы на правильном пути, когда будете выяснять, когда мышь переходит с вершины вниз, и пишете обработчик для этого. Для многих игр достаточно хорошо рассматривать событие mouseUp как щелчок.
В зависимости от вашей игры, вы, вероятно, захотите обрабатывать оба события - например, в RTS, вы, вероятно, захотите включить выбор перетаскивания, а также выбор одним щелчком мыши. Разница заключается в том, как долго мышь находилась в состоянии «Вниз» до ее отпускания.
(Да, вы в основном ответили на свой вопрос)
источник
Нет «лучшего» - вам нужны все из них.
Если я стреляю из пистолета, я не хочу ждать освобождения мыши, чтобы вызвать эффект стрельбы из оружия. И если вы перетаскиваете прямоугольник вокруг группы юнитов, вы запускаете действие перетаскивания мышью вниз.
С другой стороны, если я нажимаю на элемент графического интерфейса, то я хочу дождаться полного щелчка, потому что это то, к чему я привык.
Таким образом, вы, вероятно, должны реализовать мышь «вниз», «мышь вверх», «перетаскивание мышью» (мышь вверх в значительно отличном от мыши месте) и «щелчок мышью» (мышь вверх в том же месте, что и мышь вниз), и подключить их к частям вашей игры как вы считаете нужным.
источник
Способ, которым справляются большинство оконных систем, а также игры, над которыми я работал (и должен был частично реализовывать себя), заключается в том, чтобы на каждой кнопке было немного, определяющее, вошла ли мышь в состояние нажатия мыши над данной кнопкой. Устанавливается только рамка, в которой мышь опускается и очищается только при отпускании кнопки мыши. Если и только если мышь отпущена над кнопкой и бит установлен, то запускается событие нажатия кнопки.
(Вы, вероятно, также хотите установить флаг, который будет установлен в true, когда бит установлен, и мышь наводит курсор на вашу кнопку, так что вы можете изменить кнопку, чтобы использовать нажатую текстуру вместо ее обычной.)
Это основная схема большинства кнопок. Идите вперед и найдите диалоговое окно. Нажмите на кнопку отмены, но не отпускайте. Кнопка становится нажатой, когда мышь находится над ней, и возвращается в нормальное состояние, если ваша мышь перестает зависать над ней, но она вернется к нажатой, если вы вернетесь к ней. Он запускает свое действие, только если вы отпустите, и вы над ним. Не используйте счет в миллисекундах, это в основном только для обнаружения двойных кликов в пределах вашего порога.
(и если вы действительно хотите получить фантазию, есть события, которые вы можете подключить к каждому из этих переходов. Например, MouseOver при входе и при выходе, MouseDown вход / выход, MouseUp вход / выход, MouseClicked вход / выход и т. д. )
источник
Кнопки мыши и клавиши клавиатуры могут иметь несколько различных событий, которые зависят от выбранного вами языка / библиотеки, наиболее распространенные:
Клавиша вниз, срабатывает при нажатии кнопки.
Ключ, запускается при отпускании кнопки.
Клавиша запаздывает, запускается при нажатии кнопки, а затем многократно срабатывает с некоторым системным интервалом, пока клавиша не будет отпущена.
Вдобавок к этому может также быть звонок, чтобы сказать, нажата ли клавиша в настоящее время или нет.
Важно, чтобы вы точно знали, какой инструмент вы используете, чаще всего вам сначала понадобятся два, если они недоступны, создайте их из того, что доступно.
Стандартный метод регистрации нажатия экранной кнопки с помощью мыши состоит в том, чтобы утверждать, что одна и та же кнопка была указана как при событиях вниз и вверх. Однако для многих игровых элементов это может быть слишком медленным, поэтому для многих действий может быть целесообразно заставить их произойти в случае сбоя.
источник
XOr может быть вашим другом в этой ситуации.
Это вызовет sendMouseClickEvent () всякий раз, когда состояние кнопки мыши изменяется с false на true.
источник
if (!oldIsButtonUp && isButtonUp) {
.Версия этого кода для XNA будет выглядеть примерно так (упрощено просто для обнаружения события нажатия мыши, для обнаружения двойного щелчка вам понадобится что-то более сложное);
источник