我在一个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 ,那么它会在移动之前暂停一瞬间。
无论如何,当你按下一个键时,运动更平滑并且摆脱暂停?
感谢。
答案 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,所以我不完全确定语法,但你明白了。