我编写了一个俄罗斯方块游戏。到目前为止,我已经实现了一个间隔很短,大约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秒的方法。
或者还有另一种我现在没有看到的方式吗?
答案 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;
}
}