XNA游戏冻结了

时间:2015-12-31 16:15:43

标签: xna monogame

我正在关注创建2D空间射击游戏的教程。它工作正常,直到我添加代码产生敌人的怪物,现在它只是运行但它被冻结。我不明白为什么它不会工作。在任何地方或类似的地方都没有错误。

感谢。

1 个答案:

答案 0 :(得分:0)

您的更新方法中包含括号的小错字。

protected override void Update(GameTime gameTime)
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
        Exit();
    //updating mobs and checking for collisions
    foreach (Mobs M in mobsList)
    {
        // Updating the mobs, collision checking, etc here
        ...

        ...
        Player.update(gameTime);
        bG.update(gameTime);
        loadAsteroids();
        loadMobs();

        foreach (Roids R in asteroidList)
        {
            // Updating the asteroids, collision checking, etc
            ...

            ...
            M.update(gameTime);
            R.update(gameTime);
        }

        base.Update(gameTime);
    }
}

这有两个主要的错误。首先,这段代码:

Player.update(gameTime);
bG.update(gameTime);
loadAsteroids();
loadMobs();

foreach (Roids R in asteroidList)
{
    // Updating the asteroids, collision checking, etc
    ...
    M.update(gameTime);
    R.update(gameTime);
}
base.Update(gameTime);

将在第一个foreach循环内运行。每次调用更新时,您都会为每个暴徒更新一次播放器,背景,每个小行星和窗口。这仅适用于每次更新一次,而不是每次更新的一次。 这就是为什么你的游戏滞后或冻结。这只是暴徒的foreach循环中支架的错位 - 将所有这些东西移到foreach循环之外。

另一个错误是这部分:

foreach (Roids R in asteroidList)
{
    // Updating the asteroids, collision checking, etc
    ...
    M.update(gameTime); /* THIS LINE HERE */
    R.update(gameTime);
}

在这里,您每个小行星更新一次Mob成员。如果屏幕上有15个小行星,每个暴民成员将更新15次。将该行换成第一个foreach循环。