我遇到的问题是,每当用户按下任何移动按钮时,计时器就会冻结。这意味着如果用户只是按住'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);
}
}
答案 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类。
希望这有帮助, 最好的祝福, 汤姆。