1

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

受保护的覆盖无效 OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    键 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它会在移动之前暂停片刻。
有没有办法让移动更顺畅,并在你按住一个键时摆脱停顿?
谢谢。

4

2 回答 2

3

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

按下键时,您true在 keydown 方法和游戏/渲染循环中设置适当的索引,gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);根据数组中的键是true. 您将键值设置为false在 keyrelease 事件方法中释放键的时间(我不确定它在 C# 中是什么)。

这样,您将获得平滑的滚动,并且不会延迟启动。

于 2009-01-06T00:15:34.747 回答
1

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

要使运动平滑,请确保使用 DateTime 的频率不超过每秒 X 次。

像:

private static DateTime nextUpdate

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

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

于 2008-11-03T23:12:49.460 回答