簡體   English   中英

為什么看起來操作沒有按照代碼的順序執行?

[英]Why does it seem like operations are not being performed in the order of the code?

這是一些背景知識。 我正在開發類似“崩潰”的游戲。 積木填滿了底部,當所有十二個區塊都被填滿后,他們會向上推進到比賽場地。 我有一個名為(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;
}

因此,問題的最大部分在於您根據刻度的大小遞減一些計時器,然后運行一些比較。 比定時器所做的更多(尤其是浮點數的舍入和精度損失等等)而不僅僅是時間基本的比較。

例如,你執行fltSpawn += elapsed以及后來的fltSpawn -= spawnTick會導致浮點舍入/ 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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM