以下是一些背景信息。我正在制作一个类似于“崩溃”的游戏。方块填满底部,当所有十二个方块都填满时,它们会推到游戏区域上方。我有一个计数器叫做(intNextSpawn),不仅告诉何时“推上”下一行,还计算了图形的向量。当方块被推上去时,它将重置为0。
我在屏幕上添加了一些调试文本,试图查看发生了什么,但似乎找不到问题所在。它几乎像是在随机化应该出现的方块时仍在增加计数器(顺序混乱)。在测试过程中,我最终得到了“空白”方块,并且会引起一些非常糟糕的效果。当我提高速度时情况变得更糟。
我愿意发布可能有帮助的任何其他代码。以下是可能发生这种情况的两个主要块。我可能做错了什么,或者有没有一种方法可以防止这种情况发生(如果是这样的话)?
非常感谢任何帮助。
编辑...第一个代码块在“更新”方法中
// Calculate time between spawning bricks
float spawnTick = fltSpawnSpeed * fltSpawnSpeedModifier;
fltSpawn += elapsed;
if (fltSpawn > spawnTick)
{
// Fetch a new random block.
poNextLayer[intNextSpawn] = RandomSpawn();
// Increment counter
intNextSpawn++;
// Max index reached
if (intNextSpawn == 12)
{
// Push the line up. Returns true if lines go over the top.
if (PushLine())
{
gmStateNew = GameState.GameOver;
gmStateOld = GameState.Playing;
}
// Game still in play.
else
{
// Reset spawn row to empty bricks.
for (int i = 0; i < 12; i++)
poNextLayer[i] = new PlayObject(ObjectType.Brick, PlayColor.Neutral, Vector2.Zero);
intNextSpawn = 0; // Reset spawn counter.
intLines--; // One less line to go...
}
}
fltSpawn -= spawnTick;
}
private bool PushLine()
{
// Go through the playfield top down.
for (int y = 14; y >= 0; y--)
{
// and left to right
for (int x = 0; x < 12; x++)
{
// Top row contains an active block (GameOver)
if ((y == 14) && (poPlayField[x, y].Active))
// Stop here
return true;
else
{
// Not bottom row
if (y > 0)
{
// Copy from block below
poPlayField[x, y] = poPlayField[x, y - 1];
// Move drawing position up 32px
poPlayField[x, y].MoveUp();
}
// Bottom row
else
{
// Copy from spawning row
poPlayField[x, y] = poNextLayer[x];
// Move drawing position up 32px (plus 4 more)
poPlayField[x, y].MoveUp(4);
// Make the block active (clickable)
poPlayField[x, y].Active = true;
}
}
}
}
// Game still in play.
return false;
}
game.SuppressDraw(); this.IsFixedTimeStep = true;
方法在很大程度上解决了这个问题。当速度达到0.01f时,我可以让方块飞过屏幕,但在绘制方法中仍然存在一些小故障。我正在处理这些故障的错误处理,以免以后出现问题。 - Robert Fleck