2015-12-31 153 views
0

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

谢谢。

+0

请向我们展示在发生这种情况时正在处理的部分代码。 –

+0

我不知道什么时候开始这样做,我以为我已经完成了它,我跑了它。视觉工作室可以看到的代码中没有错误。 – Baccy

+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); 
} 

在这里,你每一次小行星更新每个黑帮成员。如果你在屏幕上有15个小行星,每个暴徒成员将被更新15次。将它排到第一个foreach循环中。

+0

感谢队友它不冻结了,但是我的敌人根本不会产卵。 – Baccy

+0

在'loadMobs'中放置一个断点,并逐步完成。确保鲍勃正在创建,而不是销毁,开始。由于游戏不再被冻结,您应该能够从此处使用断点来帮助找出错误。如果您仍然无法弄清楚,请将其作为一个新问题发布。 –

+0

我不知道如何做到这一点,即时通讯相当新,在这方面也很糟糕。 – Baccy