【问题标题】:How to slow down a while loop inside a timer如何减慢计时器内的while循环
【发布时间】:2016-09-03 05:19:12
【问题描述】:

我需要一些帮助来减慢计时器内的 while 循环。我正在制作一个平台游戏,并希望一个图片框(块)来回移动,我已经成功了。然而,这个区块移动得如此之快,以至于它让其他一切都滞后了。任何帮助将不胜感激!

        private void timer2_Tick(object sender, EventArgs e)
    {

        while (block.Left > (ClientSize.Width-ClientSize.Width))
        {

            block.Left -= 1;
            if (block.Left == (ClientSize.Width - ClientSize.Width))
            {
                break;
            }

        }
        while (block.Right < ClientSize.Width)
        {

            block.Left += 1;
            if (block.Right == ClientSize.Width)
            {
                break;
            }  
        }   
    }
}

【问题讨论】:

  • 您可以使用Thread.Sleep(1000)Task.Delay 来注入延迟
  • 有类似你的问题:This would probably help
  • 摆脱 while 循环,因此单个计时器滴答会将块移动一个增量。需要大于 1,你需要一个 velocity 变量。
  • 线程确实减慢了图片框的速度,但我无法使用此解决方案移动我的主角。我正在寻找一种方法来进行较慢的连续运动,而不会停在两侧。
  • @HansPassant ,我该怎么做?我对 c# 很陌生,完全不确定如何从该解决方案开始。谢谢!

标签: c# timer while-loop picturebox slowdown


【解决方案1】:

您可以使用线程来执行此操作,您可以查看示例代码:

private void timer2_Tick(object sender, EventArgs e)
    {

        while (block.Left > (ClientSize.Width-ClientSize.Width))
        {
            Thread.Sleep(50); //how about putting sleep here for 50ms?
            block.Left -= 1;
            if (block.Left == (ClientSize.Width - ClientSize.Width))
            {
                break;
            }

        }
        while (block.Right < ClientSize.Width)
        {
            Thread.Sleep(50); //how about putting sleep here for 50ms?
            block.Left += 1;
            if (block.Right == ClientSize.Width)
            {
                break;
            }  
        }   
    }

【讨论】:

  • 线程确实减慢了图片框的速度,不幸的是我无法用这个解决方案移动我的主角。谢谢!
【解决方案2】:

您可以更改计时器滴答的间隔。您可以使用 Interval 属性来执行此操作。

timer2.Interval = 1000; //This would make the timer tick every second.

该值表示滴答之间的毫秒数。

完成此操作后,您可以更改滴答事件中的代码,使其仅根据滴答事件移动一次。

private void timer2_Tick(object sender, EventArgs e)
{
    if (block.Left < (ClientSize.Width-ClientSize.Width)
    {
        block.Left -= 1;
    }

    if (block.Right > (ClientSize.Width-ClientSize.Width)
    {
        block.Left += 1;
    }
}

这样,您将能够使用timer2.Interval 属性调整移动速度。

【讨论】:

  • 我已经尝试过间隔,但这会使一切都停止在一侧。我正在寻找一种方法来进行较慢的连续运动。但是,使用“如果”不起作用,它会永远偏向一边。谢谢!
  • 这是正确的做法。但是,您的代码有很多错误......比如不正确的比较或变量(以及很高的延迟)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2017-06-19
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多