2

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

谁能告诉我为什么会这样?

4

3 回答 3

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();
    }
}
于 2013-05-23T20:05:42.443 回答
0

您的问题(可能是)在这里:

void timer_Tick(object sender, EventArgs e, Sharp sharp)
{


    if (CheckDown())
    {
        Some code.....

    }
    else
    {
        Watch().Start();
    }

    //throw new NotImplementedException();
}

我不确切知道您的 CheckDown() 背后的逻辑,但我假设它在块触地时返回 false*?在这种情况下,每次块落下时,它都会创建一个新的计时器,而您已经有一个从 Form1_Load() 运行的计时器......因此您会看到速度的逐渐增加。

于 2013-05-23T19:54:50.583 回答
0

也许你正在执行这个:

timer.Tick += ...

每个块多次?

似乎应该在构造函数中。它现在在哪里:只要有:

if(...)
   timer.Enabled = true;
else
   timer.Enabled = false;
于 2013-05-23T19:58:06.077 回答