【问题标题】:Jerky movement in WPFWPF中的生涩运动
【发布时间】:2008-11-03 23:06:01
【问题描述】:

我在一个 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,它会在移动之前暂停片刻。
有没有什么办法可以让动作更流畅,并消除按住键时的停顿?
谢谢。

【问题讨论】:

    标签: c# key keypress


    【解决方案1】:

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

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

    这样你将获得流畅的滚动,并且不会有启动延迟。

    【讨论】:

    • 嘿,谢谢。但是你知道为什么会这样吗?而我之前的方式却没有?
    【解决方案2】:

    是的,您可以将时间纳入您的计算中。目前,只要事件触发,您就加/减 5,这并不是真正可预测的。

    为了使移动更加平滑,请确保使用 DateTime 的次数不要超过每秒 X 次。

    喜欢:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多