2008-11-03 66 views
1

我在300x300的窗口内有一个800x600的画布。当我按下某个键时,我希望画布朝这个方向移动。
我这样做背后的窗口的代码中:WPF中的生涩运动

 
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,那么在移动之前它会暂停一秒。
无论如何,当你按住一个键时,动作更平滑,并摆脱暂停?
谢谢。

回答

3

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

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

这样你就会平滑滚动,并且不会在启动时出现延迟。

+0

嘿,谢谢。但是你知道这是为什么吗?我以前的方式不行? – jkidv 2009-01-29 16:38:13

1

是的,你可以把时间纳入你的计算。目前,您在事件触发时添加/减去5,这并不是真正可预测的。

要平滑运动,请确保您使用DateTime不会比每秒X次更频繁地发动。

,如:

private static DateTime nextUpdate 

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

我没有VS现在,所以我不能完全肯定的语法,但你的想法。