【问题标题】:How to properly move a PictureBox in C#如何在 C# 中正确移动图片框
【发布时间】:2021-11-25 10:50:38
【问题描述】:

我正在尝试使用 WSAD 键移动 PictureBox“英雄”。它可以工作,但是只要按下 2 个按钮,它就会向按下的最旧按钮的方向移动(应该如此),但是当其中一个按钮被释放时,在再次移动之前会有一点延迟。有谁知道如何解决这个问题?

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
                switch (e.KeyCode)
                {
                    case Keys.S:
                        hero.SetDirection("down");
                        break;
                    case Keys.W:
                        hero.SetDirection("up");
                        break;
                    case Keys.D:
                        hero.SetDirection("right");
                        break;
                    case Keys.A:
                        hero.SetDirection("left");
                        break;
                        
                }
            hero.heroTimer.Start();
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if(e.KeyCode == Keys.S || e.KeyCode == Keys.W || e.KeyCode == Keys.A || e.KeyCode == Keys.D)
            {  
                    hero.SetDirection("");
                    hero.heroTimer.Stop();     
            }
        }

这是来自英雄班

private void heroTimer_Tick(object sender, EventArgs e)
        {

            switch (direction)
            {
                case "down":
                    this.Top += 5;
                    break;
                case "up":
                    this.Top -= 5;
                    break;
                case "left":
                    this.Left -= 5;
                    break;
                case "right":
                    this.Left += 5;
                    break;

            }
            
        }

P.S 如果代码混乱,我很抱歉,我对此很陌生。

【问题讨论】:

  • 当你按下键直到计时器计时没有任何反应,通过直接调用 heroTimer_Tick() 来解决这个问题。通过检查释放的键是否与当前方向匹配来修复 KeyUp 处理程序。

标签: c# winforms timer


【解决方案1】:

但是当其中一个按钮被释放时,在它再次移动之前会有一点延迟

可能是因为释放任何按钮都会停止计时器。解决此问题的一种方法是保留按下的键列表,并且仅在释放所有键时才停止计时器。这也可以让您应用多个移动,即向下+向左将沿对角线移动图片。您可能还想在按键被按下时直接调用heroTimer_Tick 方法,以便在与按键相同的帧上开始移动。

我还建议根据事件之间的实际时间来缩放您的运动。如果 UI 线程忙于做其他事情,Winforms 计时器事件可能会延迟,甚至完全省略。因此,秒表可能有助于准确测量每个事件之间的时间并允许您缩放运动。

在游戏中使用通用更新时钟是相当普遍的。而不是使用不同计时器的多个组件,您只需使用一个以固定速率、尽可能快或尽可能快到某个最大帧速率的单个组件。然后,此计时器将调用所有游戏组件的更新方法,通常使用 delta-time 参数。这往往会提供更一致的行为,因为所有组件每帧都以相同的顺序更新。

最后,使用字符串来存储移动不是一个好的做法,并且可能会导致编译器无法检测到问题。枚举将是更适合描述运动的类型。可选地使用 [Flags] 属性和单独的位来同时描述多个动作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多