C#在另一个计时器中使用计时器?

时间:2016-08-17 16:15:35

标签: c# timer

我编写了一个俄罗斯方块游戏。到目前为止,我已经实现了一个间隔很短,大约50毫秒的定时器。当前下降的tetromino每次打勾都会向下移动游戏矩阵中的一个位置。然后游戏检查是否有碰撞,如果是这样的话,tetromino被标记为"降落"产生了新的tetromino。

不,我有这个问题,我想让玩家有机会将tetromino向左或向右移动,让我们说它降落后0.5秒,以便有可能将tetromino移到悬垂下方登陆了tetromino。

但是使用我当前的代码我遇到的问题是,一旦检测到碰撞,计时器就会继续并产生下一个tetromino。我现在的想法是尝试实现第二个计时器,每次检测到碰撞时激活0.5秒,以允许主计时器继续进行额外的键盘输入。因此,基本上暂停主计时器0.5秒,并允许程序在此期间检测键盘输入,然后继续主计时器。

到目前为止我尝试过的所有东西都没有真正起作用。看起来第一个计时器总是继续运行,而我有第二个计时器处于活动状态。

这是我的第一个计时器的样子:

private void TimerBrick_Tick(object sender, EventArgs e)
        {
            ResetGameBoard(jaggedTetrisBricks[rnd-1][rotation], _brickX, _brickY, xLengthBrick, yLengthBrick);
            _brickX++;
            CollisionCheck(jaggedTetrisBricks[rnd - 1][rotation], _brickX, _brickY, xLengthBrick, yLengthBrick);
            LineCheck();

            Invalidate();
        }

现在我需要在CollisionCheck()方法中实现一种在代码继续LineCheck()之前等待0.5秒的方法。

或者还有另一种我现在没有看到的方式吗?

1 个答案:

答案 0 :(得分:1)

除了我之前的评论 - 这里有一些伪代码:

enum GameState
{
    Starting,
    CreateBrick,
    BrickFalling,
    MoveSideways
}

private GameState curState = Starting;
private ushort ctSideways;

private void TimerBrick_Tick(object sender, EventArgs e)
{
    switch (curState)
    {
        case Starting:
            InitialiseGame();
            curState = CreateBrick;
            break;

        case CreateBrick:
            CreateNewBrick();
            curState = BrickFalling;
            break;

        case BrickFalling:
            .....
            .....
            if (CollisionCheck())
            {
                ctSideways = 0;
                curState = MoveSideways;
            }
            break;

        case MoveSideways:
            .....
            .....
            ctSidways++;
            if (ctSideways == 10)
                curState = CreateBrick;
            break;
    }

}