Я так близко! Я использую пример XNA Game State Management, найденный здесь , и пытаюсь изменить способ обработки ввода, чтобы я мог задержать нажатие клавиши / создать буфер ввода.
В GameplayScreen.cs я объявил дубль elapsedTime и установил его равным 0.
В методе HandleInput я изменил нажатие кнопки Key.Right на:
if (keyboardState.IsKeyDown(Keys.Left))
movement.X -= 50;
if (keyboardState.IsKeyDown(Keys.Right))
{
elapsedTime -= gameTime.ElapsedGameTime.TotalMilliseconds;
if (elapsedTime <= 0)
{
movement.X += 50;
elapsedTime = 10;
}
}
else
{
elapsedTime = 0;
}
Псевдокод:
Если клавиша со стрелкой вправо не нажата, установите для elapsedTime значение 0. Если она нажата, значение elapsedTime будет равно минус миллисекунды с момента последнего кадра. Если тогда разница равна 0 или меньше, переместите объект 50, а затем установите для параметра elapsedTime значение 10 (задержка).
Если клавиша удерживается, elapsedTime никогда не следует устанавливать в 0 через else. Вместо этого, после того, как elapsedTime установлен в 10 после успешной проверки, elapsedTime должен становиться все ниже и ниже, потому что он вычитается из TotalMilliseconds. Когда он достигает 0, он снова успешно проходит проверку и снова перемещает объект.
Проблема в том, что он перемещает объект один раз за нажатие, но не работает, если вы удерживаете его нажатым. Может ли кто-нибудь предложить какой-либо совет / пример / немного знаний в этом направлении? Заранее спасибо, это сводит меня с ума. В теории я думал, что это наверняка сработает.
ПОЯСНЕНИЯ
Думайте о сетке, когда вы думаете о том, как я хочу, чтобы блок двигался. Вместо того, чтобы просто плавно перемещаться по экрану, он перемещается по ширине (сорта-прыжки) в следующую позицию. Если я удерживаю клавишу, она мчится по экрану. Я хочу замедлить весь этот процесс, чтобы удержание клавиши создавало задержку в X миллисекунд между его «прыжком» / перемещением по ширине.
РЕДАКТИРОВАТЬ: Оказывается, gameTime.ElapsedGameTime.TotalMilliseconds возвращает 0 ... все время. Понятия не имею почему.
решено: Обнаружено, что gameTime.ElapsedGameTime.TotalMilliseconds возвращало 0 ... переместило его в другое место.