keydown冻结计时器c#

时间:2010-02-26 17:16:47

标签: c# timer

嘿,我正在制作一个蛙式游戏,我正在使用计时器让图像在屏幕上移动。当用户移动'frog'时,我也使用keydown事件来处理。所以,w向上移动,向下移动等等。

我遇到的问题是,每当用户按下任何移动按钮时,计时器就会冻结。这意味着如果用户只是按住'w'或向上,所有汽车都会停止移动。

是否有办法将计时器放在后台工作人员中,或者即使用户正在移动,也可以让计时器继续进行计时?

感谢您的帮助!

这就是我目前所拥有的:

    public string i;
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == 68)
        {
            i = "right";
            backgroundWorker1.RunWorkerAsync();
        }
    }


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        if (i == "right")
        {
            pictureBox1.Location = new Point((pictureBox1.Location.X + 17), pictureBox1.Location.Y);
        }
     }

3 个答案:

答案 0 :(得分:3)

后台线程或工作人员是解决方案。这是一个简单的后台工作者。

        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerAsync();
    }


    static Timer _t;
    static void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        _t = new Timer();
        _t.Start();
    }

答案 1 :(得分:2)

使用调试器运行程序时,请查看“输出”窗口。你会看到很多IllegalOperationException消息。后台工作程序方法因异常而死亡,您没有注意到它,因为您没有检查DoWorkCompleted事件处理程序中的e.Error属性。这就是它不动的原因。

不允许在后台线程中设置控件的属性。这就是异常试图告诉你的。您需要放弃使用线程来实现UI逻辑的想法。游戏通常使用game loop实现。

答案 2 :(得分:1)

您需要实现一个在后台运行的线程,以跟踪计时器或使用Backgroundworker类为您执行此操作。如果需要精确定时器,请使用System.Threading.Timer类。

希望这有帮助, 最好的祝福, 汤姆。