我正在尝试用C#编写《俄罗斯方块》。第一个块的速度是正常的,但是第二个块的速度比第一个块快两倍,然后第三个块的速度快了三倍。我认为计时器肯定有问题。
这是我的代码的一部分:
Timer timer = new Timer();
private void Form1_Load(object sender, EventArgs e)
{
/* ... Some code ... */
Watch().Start();
}
public Timer Watch()
{
timer.Stop();
timer.Interval = 1000;
timer.Enabled = true;
/* ... Some code ... */
// Check if the block can fall down
if (CheckDown() == true)
{
timer.Tick += (sender, e) => timer_Tick(sender, e, Current_sharp.sharp);
}
return timer;
}
void timer_Tick(object sender, EventArgs e, Sharp sharp)
{
if (CheckDown())
{
/* ... Some code ... */
}
else
{
Watch().Start();
}
}
谁能告诉我为什么会这样吗?
最佳答案
问题是您的函数Watch()
。
事件可以在每次触发时调用多个函数,这就是为什么它使用+=
符号而不是=
符号的原因。每次呼叫timer.Tick += (sender, e) => timer_Tick(sender, e, Current_sharp.sharp);
时,您都将对timer_Tick
的另一个呼叫添加到队列中。
因此,第一次timer_Tick
被调用一次,然后重新注册处理程序,然后第二次围绕timer_Tick
的调用被调用两次,并且向队列添加了另外两个触发(使其变为4)...等等上。
我看不到这里有完整的代码,这是解决问题的最佳方法。我所做的就是将timer.Tick
注册从Watch()
移到Form1_Load()
Timer timer = new Timer();
private void Form1_Load(object sender, EventArgs e)
{
/* ... Some code ... */
//regester the event handler here, and only do it once.
timer.Tick += (sender, e) => timer_Tick(sender, e, Current_sharp.sharp);
Watch().Start();
}
public Timer Watch()
{
timer.Stop();
timer.Interval = 1000;
timer.Enabled = true;
/* ... Some code ... */
return timer;
}
void timer_Tick(object sender, EventArgs e, Sharp sharp)
{
if (CheckDown())
{
/* ... Some code ... */
}
else
{
Watch().Start();
}
}
关于c# - 俄罗斯方块计时器不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16722665/