这是一些背景知识.我正在开发类似"崩溃"的游戏.积木填满了底部,当所有十二个区块都被填满后,他们会向上推进到比赛场地.我有一个名为(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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
因此,问题的最大部分是您根据刻度的大小递减一些计时器,然后运行一些比较。与其为计时器做所有这些(特别是浮点数的舍入和精度损失等),而只是进行时间基本比较。
例如,您这样做fltSpawn += elapsed以及稍后fltSpawn -= spawnTick将导致浮点舍入/精度错误。
尝试更多类似这样的事情:
int64 spawnDelay = 1000000; // 10,000 ticks per ms, so this is 100ms
...
if (DateTime.Now() > nextSpawn)
{
// Fetch a new random block.
poNextLayer[intNextSpawn] = RandomSpawn();
...
// At some point set the next spawn time
nextSpawn += new TimeSpan(spawnDelay * spawnSpeedModifier);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |