俄罗斯方块计时器不起作用

时间:2013-05-23 19:51:16

标签: c#

我正在尝试用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();
    }
}

有人能告诉我为什么会这样吗?

3 个答案:

答案 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;