WPF中的生涩运动

时间:2008-11-03 23:06:01

标签: c# key keypress

我在一个300x300的窗口内有一个800x600的画布。当我按下某个键时,我希望画布朝那个方向移动 我在窗口的代码中完成了这个:

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 个答案:

答案 0 :(得分:3)

目前,您的设置正在接受垃圾密码输入(按住某个键)。我在大多数基于事件的输入游戏中看到它的方式是使用布尔数组keydown[256],映射键盘(索引是键值);所有值都已初始化为false

当按下该键时,在keydown方法和游戏/渲染循环中将相应的索引设置为true,根据数组中的键gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);调用true false 1}}。在密钥释放事件方法中释放密钥时,您将密钥值设置为{{1}}(我不确定它在C#中的含义)。

通过这种方式,您可以顺利滚动,并且启动时不会有延迟。

答案 1 :(得分:1)

是的,您可以将时间纳入计算中。目前,每当事件触发时,您都会添加/减去5,这实际上是不可预测的。

为了平滑移动,请确保使用DateTime不会每秒发射超过X次。

像:

private static DateTime nextUpdate

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

我现在没有VS,所以我不完全确定语法,但你明白了。