【问题标题】:Randomly spawning enemies XNA 4.0 (WP7)随机生成敌人 XNA 4.0 (WP7)
【发布时间】:2012-04-23 14:54:27
【问题描述】:

我正在用 C# 和 XNA 为 windows phone 创建一个 2d 侧滚动(有点)游戏。

我有一个角色动画,使它看起来像精灵在移动,但是背景和敌人是唯一移动的东西。 我已经为敌人加载了纹理,屏幕上的位置是静态的,这很好。 但我的问题是,我想随机生成这些敌人。 我已经设置了一个随机数生成器、一个 int 和几个 TimeSpan 变量。

这是我放在 UpdateEnemies 方法中的代码。

注意:在更新中,我打电话给UpdateEnemies(gameTime);

random = new Random();
spawnSeconds = random.Next(1, 6);
enemySpawnTime = TimeSpan.FromSeconds(spawnSeconds); 
if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
{
    previousSpawnTime = gameTime.TotalGameTime;
    // Add an Enemy
    AddEnemy();
}

我在这里遇到了一个问题,因为生成的敌人不是随机的。对于特定的运行,它们以相同的间隔生成。

我使用了断点,spawnSecondsenemySpawnTime 每次更新都很好,但仍然是这个问题。

任何帮助将不胜感激。

【问题讨论】:

  • 我建议你的 spawnSeconds +enemySpawnTime 最好把它放在生成条件中,然后你只设置一次随机数。否则,你每帧都调用它。
  • 随机生成一个字段,例如私人随机 rand = new Random();
  • lukas - 我将它设置在顶部作为随机随机但你不能在那里初始化它所以我正在这样做,目前,在初始化方法中。 @BugFinder - 我不完全确定你的意思?

标签: c# windows-phone-7 random xna


【解决方案1】:

假设 UpdateEnemies 在每个 Update() 上都被调用,那么您在每个 Update() 上都会更改enemySpawnTime,这是没有意义的。你应该只在敌人产生时改变它,即:

if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
{
    // Add an Enemy
    AddEnemy();

    // Update the time left next enemy spawn
    previousSpawnTime = gameTime.TotalGameTime;
    var spawnSeconds = random.Next(1, 6); // random should be a member of the class
    enemySpawnTime = TimeSpan.FromSeconds(spawnSeconds); 
}

如前所述,只创建一次 Random() 对象,例如在 Initialize() 中,并使其成为类的成员。

【讨论】:

  • 哈,我写的完全一样。应该先阅读你的答案。我真的认为这是问题所在。
【解决方案2】:

随机=新随机();

每次调用更新函数时,您都会创建一个新的 Random 实例。 这样做会导致您的随机函数生成相同的值,因为它将基于相同的种子。

在 Update 函数之外实例化您的 Random 对象,可能在您的构造函数中。这样做将改进您的代码,并解决您的问题。

【讨论】:

  • 感谢您的快速回复,我从更新中删除了 random = new Random() 并将其放在初始化方法中。仍然有同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2016-12-16
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
相关资源
最近更新 更多