c# - 为什么看起来操作没有按照代码的顺序执行?

标签 c# xna

这是一些背景。我正在开发类似于“崩溃”的游戏。 block 在底部填满,当所有 12 个 block 都填满后,它们就会向上推到运动场。我有一个名为 (intNextSpawn) 的计数器,它不仅告诉何时“推高”下一行,还计算图形的向量。当 block 被推上去时,它重置为 0。

我在屏幕上添加了一些调试文本来尝试查看发生了什么,但我似乎无法找出问题所在。看起来它似乎仍在增加计数器,同时试图随机化应该出现的 block (事情乱序)。我最终得到了“空白” block ,它在测试时会导致一些非常棘手的效果。当提高速度时,情况会变得更糟。

我愿意发布任何可能有帮助的附加代码。以下是可能发生这种情况的两个主要 block 。有什么地方我可能做错了,或者有什么方法可以防止这种情况发生(如果它正在做的话)?

如有任何帮助,我们将不胜感激。

编辑...第一个代码块在“更新”方法中

// 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;
}

最佳答案

所以,你的问题的最大部分是你正在根据滴答的大小递减一些计时器,然后运行一些比较。而不是为计时器做所有这些(尤其是四舍五入和 float 的精度损失等......)而不是仅仅用于时间基本比较。

例如,您执行 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);

}

关于c# - 为什么看起来操作没有按照代码的顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540820/

相关文章:

c# - XNA 中的 ColorMatrix 等效项

c# - Visual C# 方法调用使用过多内存?

c# - 如何将实时视频从 WP7 相机流式传输到 XNA 应用程序?

c# - 在 WCF 中公开可序列化枚举属性

c# - 对从抽象类继承的类进行单元测试

c# - 面向组件的设计 : Problems with dependencies in dialogs

c# - XNA Game Studio 在 2013 年过时了吗?

c# - 如何确定 C# 编译器的路径?

c# - 如何从 .odt 文件中抓取文本

deployment - 应用程序部署到 Windows Phone 7 应用程序而不是 xbox live