我正在尝试用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();
}
}
有人能告诉我为什么会这样吗?
答案 0 :(得分:1)
问题在于你的功能Watch()
。
事件可以在每次触发时调用多个函数,这就是它使用+=
符号而不是=
符号的原因。每次拨打timer.Tick += (sender, e) => timer_Tick(sender, e, Current_sharp.sharp);
时,您都会向队列添加timer_Tick
的额外呼叫。
所以第一次timer_Tick
被调用一次,然后它重新注册处理程序,然后第二次timer_Tick
被调用两次,并且它再添加2次激活队列(使其成为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();
}
}
答案 1 :(得分:0)
你的问题(可能是):
void timer_Tick(object sender, EventArgs e, Sharp sharp)
{
if (CheckDown())
{
Some code.....
}
else
{
Watch().Start();
}
//throw new NotImplementedException();
}
我不确切知道CheckDown()后面的逻辑,但我认为当块接触时它返回false *?在这种情况下,每当一个块掉落它会创建一个新的计时器,而你已经有一个从Form1_Load()运行的计时器...因此你看到速度逐渐增加的原因。
答案 2 :(得分:0)
也许你正在执行这个:
timer.Tick += ...
每个块多次?
似乎应该在构造函数中。它现在的位置:只有:
if(...)
timer.Enabled = true;
else
timer.Enabled = false;