【发布时间】:2008-11-03 23:06:01
【问题描述】:
我在一个 300x300 的窗口内有一个 800x600 的画布。当我按下某个键时,我希望画布朝那个方向移动。
我已经在后面的窗口代码中完成了这个:
嗯,它有效,但动作很生涩。如果我按住一个键,例如 W,它会在移动之前暂停片刻。
有没有什么办法可以让动作更流畅,并消除按住键时的停顿?
谢谢。
【问题讨论】:
我在一个 300x300 的窗口内有一个 800x600 的画布。当我按下某个键时,我希望画布朝那个方向移动。
我已经在后面的窗口代码中完成了这个:
嗯,它有效,但动作很生涩。如果我按住一个键,例如 W,它会在移动之前暂停片刻。
有没有什么办法可以让动作更流畅,并消除按住键时的停顿?
谢谢。
【问题讨论】:
目前,您的设置正在接受垃圾键盘输入(按住一个键)。我在大多数基于事件输入的游戏中看到的方法是使用布尔数组keydown[256],映射键盘(索引是键值);所有值都初始化为false。
当按键被按下时,您在 keydown 方法中将适当的索引设置为 true,在您的游戏/渲染循环中,您调用 gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);,具体取决于数组中的键是 true。当在 keyrelease 事件方法中释放键时,您将键值设置为false(我不确定它在 C# 中是什么)。
这样你将获得流畅的滚动,并且不会有启动延迟。
【讨论】:
是的,您可以将时间纳入您的计算中。目前,只要事件触发,您就加/减 5,这并不是真正可预测的。
为了使移动更加平滑,请确保使用 DateTime 的次数不要超过每秒 X 次。
喜欢:
private static DateTime nextUpdate
if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}
我现在没有 VS,所以我不太确定语法,但你明白了。
【讨论】: