Я столкнулся с ситуацией, с которой не сталкивался до использования управляющей структуры IF с дополнительным вложенным IF. Обычно вложенный IF разбивает то, что я проверяю, на более мелкие детали, но в этом случае он фактически конфликтует с внешним условным оператором — я проверяю щелчок мыши.
Вот код -
if (mouseState.LeftButton == ButtonState.Pressed)
{
if (mouseState.LeftButton == ButtonState.Released)
{
//move sprite to clicked position
spritePos.X = mouseState.X;
spritePos.Y = mouseState.Y;
}
}
У меня есть пара вопросов. Меня учили, что условный аргумент проверяется только один раз, и если он оценивается как истинный, выполняются следующие операторы. Это правда или это действительно проверяется перед выполнением каждого оператора в блоке? - поскольку последнее, очевидно, вызовет конфликт с моим вложенным if.
Если это правда, то почему мой метод нажатия кнопки не работает? Спрайт никогда не перемещается, как если бы отпускание мыши никогда не выполнялось. Это потому, что задержка между выполнением проверки обоих условий настолько мала, что я физически не могу отпустить кнопку за это время? Могу ли я быть немного хакерским в этом и преодолеть это с задержкой по времени, которая может быть достаточно большой, чтобы позволить отпустить кнопку мыши во время проверки вложенного условного выражения?
Методы для действий щелчка мыши, которые я видел, используют свойства мыши из предыдущего кадра и сравнивают с новым кадром, чтобы проверить щелчок мыши. Но этот метод должен вводить задержку хотя бы на один кадр для фактической обработки действия. Это может быть незаметно при высокой частоте кадров, но просто ради аргумента скажу, что у меня была игра, отображающая 20 кадров в секунду. UpdateInput() будет вызываться перед рендерингом любого кадра, позиции должны обновляться, а затем кадр должен рендериться последним.
Если бы операция полного щелчка мыши могла выполняться менее чем за 1/20 секунды, не было бы предпочтительнее обрабатывать действие сразу, а не сохранять переменную при первом нажатии и сравнивать состояния в следующем кадре? Это, безусловно, было бы лучше, чем вводить дополнительную задержку ввода.
Я уверен, что это должно было быть рассмотрено другими раньше, и, возможно, я неправильно думаю об операции задержки по времени, фактически приостанавливающей выполнение кода. Могут ли временные задержки приостанавливать выполнение кода процессором или только результат этих исполнений, например рендеринг и прием ввода? У меня нет опыта их использования, и я могу сбить с толку, как будет работать задержка.
Спасибо, Эндрю.