Справка по задержке ввода с клавиатуры - PullRequest
2 голосов
/ 14 апреля 2010

Я так близко! Я использую пример 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 ... переместило его в другое место.

Ответы [ 3 ]

1 голос
/ 15 апреля 2010

Обнаружил, что gameTime.ElapsedGameTime.TotalMilliseconds возвращало 0 ... использовал параметр GameTime в методе Update, чтобы установить публичную двойную переменную с именем GameT. Затем GameT использовался в методе HandleInput и возвращал правильное время. Не самый законный способ сделать это, но пока это работает.

0 голосов
/ 15 апреля 2010

Если вы используете фиксированное игровое время, вам вообще не нужно откладывать время. Вы можете сохранить переменную, которая отслеживает «кадры» и обновлять на основе этого:

int elapsedFrames = 10;  //<- Set up somewhere higher than the function call
if (keyboardState.IsKeyDown(Keys.Right))
{
    elapsedFrames++;
    if (elapsedFrames >= 10)
    {
        movement.X += 50;
        elapsedTime = 0;
    }
}
else
{
    elapsedTime = 10;
}

Таким образом, вам не нужно иметь дело с gameTime.

0 голосов
/ 14 апреля 2010

Итак, вопрос в том, какое поведение вы хотите, чтобы ваша сущность имела?

  1. Если вы хотите, чтобы он перемещался один раз при нажатии кнопки (как при перемещении по меню), тогда вы хотите сохранить KeyboardState в переменной уровня класса, чтобы каждое обновление можно было проверять на соответствие текущему состоянию. Вы бы только переместили , если бы кнопка не была удержана в предыдущем состоянии, но удерживается сейчас. Это гарантирует, что вы будете запускать действие только один раз.
  2. Если вы хотите, чтобы он перемещался регулярно и плавно (как при прокрутке вправо при нажатии стрелки вправо), то масштабируйте переменную движения (в настоящее время жестко заданную до 50) на определенную величину (которую вы можете настроить). Так что-то вроде movement.X += 50 * .05;. Вы можете настраивать его вверх и вниз до тех пор, пока движение, которое оно делает в каждом кадре, не будет соответствовать скорости, которую вы хотите, чтобы оно двигалось
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...