Отрывистое движение в WPF - PullRequest
       37

Отрывистое движение в WPF

1 голос
/ 04 ноября 2008

У меня есть холст 800х600 внутри окна 300х300. Когда я нажимаю определенную клавишу, я хочу, чтобы полотно двигалось в этом направлении.
Я сделал это внутри кода окна:

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    Key keyPressed = e.Key;

    if (keyPressed == Key.W)
    {
        gcY += 5;
    }
    if (keyPressed == Key.S)
    {
        gcY -= 5;
    }
    if (keyPressed == Key.A)
    {
        gcX += 5;
    }
    if (keyPressed == Key.D)
    {
        gcX -= 5;
    }

    gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);
}

Ну, это работает, но движение отрывистое. И если я удерживаю клавишу, например W , она останавливается на долю секунды, прежде чем двигаться. Есть ли способ сделать движение более плавным и избавиться от паузы, когда вы удерживаете клавишу?
Спасибо.

Ответы [ 2 ]

3 голосов
/ 06 января 2009

В настоящее время ваша установка принимает спам-ввод ключа (удерживая клавишу). То, как я это делал в большинстве игр с вводом на основе событий, - это использование логического массива keydown[256], отображающего клавиатуру (индекс является значением ключа); все значения инициализированы до false.

Когда клавиша нажата, вы устанавливаете соответствующий индекс на true в методе keydown и в цикле игры / рендеринга вы вызываете gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); в зависимости от того, какие клавиши в массиве true. Вы устанавливаете значение ключа на false, когда ключ освобождается в методе события keyrelease (я не уверен, что это такое в C #).

Таким образом, вы получите плавную прокрутку, и у вас не будет задержки при запуске.

1 голос
/ 04 ноября 2008

Да, вы можете включить время в свои расчеты. В настоящее время вы добавляете / вычитаете 5 всякий раз, когда происходит событие, и это не очень предсказуемо.

Чтобы сгладить движение, убедитесь, что вы не стреляете чаще, чем X раз в секунду, используя DateTime.

как:

private static DateTime nextUpdate

if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}

У меня сейчас нет VS, поэтому я не совсем уверен в синтаксисе, но вы поняли.

...