我正在尝试用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/

10-12 15:26