Я работаю над разработкой систем меню для очень простого теста понг, который я сделал, и столкнулся с некоторыми проблемами с помощью кнопок. Несколько примеров, которые я видел, показывают, что код для перемещения вверх и вниз на экране меню выглядит просто:
if (controller.Thumbsticks.Left.Y > 0.5f) MenuUp();
Хотя теоретически это работает, этот тест выполняется каждый кадр (в вызове Update()
, якобы), проверяя состояние контроллера примерно 60 раз в секунду. Так как средний пользователь удерживает джойстик вверх, по крайней мере, на четверть секунды, в результате, нажатие на джойстик контроллера циклически перебирает все меню почти мгновенно.
Возможно, я мог бы реализовать какую-то сложную систему таймера, где она проверяет, сколько времени прошло с момента последнего изменения пункта меню и как долго удерживался джойстик, но ни один из найденных в сети примеров не использовал такой сложный система времени. Я что-то упустил?
Редактировать: Эндрю попросил в комментарии ниже ссылки на эти учебники, которые я нашел:
- Этот использует
if (controller.isButtonPressed(Buttons.LeftThumbstickUp))
, но это та же идея.
http://create.msdn.com/en-US/education/catalog/sample/game_state_management
- Я понимаю, что это XNA 2.0 (я работаю с 4.0), но принцип остается
http://www.sgtconker.com/2010/08/nick-gravelyns-alien-aggressors-tutorial/
- Кроме того, в книге Чеда Картера "Microsoft XNA Game Studio 3.0 Unleashed" на стр. 530 приведен аналогичный код. Его система проверяет предыдущее состояние геймпада, поэтому его система не будет прокручивать сразу несколько вариантов, но она также не позволяет вам прокручивать - каждый раз, когда вы хотите перейти вверх по пункту меню, вы нужно переместить джойстик назад в центр и снова сдвинуть его вверх. Мне больше нравится поведение, когда вы нажимаете и удерживаете клавишу на клавиатуре: появляется одна буква, небольшая задержка, а затем начинает повторять букву в определенном темпе.