【问题标题】:Random enemy movement direction随机敌人移动方向
【发布时间】:2012-11-19 22:15:16
【问题描述】:

我正在开发一款自上而下的射击游戏,我希望我的敌人漫无目的地四处游荡。在这段代码中,我有一个 Enemy 类,其中包含所有变量(旋转、位置等),包括主类中的 random(rnd)。

我的问题是敌人不断从屏幕的右上角移动到左下角。所以他们不是四处游荡,而是总能找到某个方向。我想知道为什么会这样。

refresh += gameTime.ElapsedGameTime.TotalSeconds;

if (refresh >= 3)
{
    refresh -= 3;
    int rndDirection = rnd.Next(4);

    if (rndDirection == 1) vektor = new Vector2(0, -1);
    if (rndDirection == 2) vektor = new Vector2(0, 1);
    if (rndDirection == 3) vektor = new Vector2(1, 0);
    if (rndDirection == 4) vektor = new Vector2(-1, 0);

    foreach (Enemy enemy in enemies)
    {
        Vector2 rndDirVec = vektor;
        enemy.directionX = enemy.position.X - rndDirVec.X;
        enemy.directionY = enemy.position.Y + rndDirVec.Y;
        enemy.rotation = (float)Math.Atan2(enemy.directionY, enemy.directionX);
    }
}
foreach (Enemy enemy in enemies) 
    {
        enemy.position -= new Vector2((float)(enemy.speed/2 *   Math.Cos(enemy.rotation)), (float)(enemy.speed/2 * Math.Sin(enemy.rotation)));
    }

我对 C# 还很陌生,所以我可能对其中的事物如何运作缺乏一些了解,所以也许有人能指出我正确的方向吗?

【问题讨论】:

  • 你在哪里声明 rnd?
  • 在主类中,我忘了添加那个

标签: c# random xna direction


【解决方案1】:

Random.Next 的整数参数是一个唯一的上界,所以rndDirection 将是 0、1、2 或 3。你永远不会增加 X 坐标,所以敌人总是向左走。

我会做这样的事情(我从来没有使用过 XNA,我不知道你的代码细节,所以我不确定这是 100% 正确):

foreach (Enemy enemy in enemies)
{
  enemy.direction.X = rnd.Next(3) - 1; // -1, 0, +1
  enemy.direction.Y = rnd.Next(3) - 1; // -1, 0, +1
  Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed);
  enemy.position = Vector2.Add(enemy.position, movement);
}

或者,如果您想要更精细的方向变化:

const float rotationStep = 5.0f * Math.PI / 180.0f; // 5 degrees
foreach (Enemy enemy in enemies)
{
  enemy.rotation += (rnd.Next(3) - 1) * rotationStep;
  enemy.direction.X = Math.Cos(enemy.rotation);
  enemy.direction.Y = Math.Sin(enemy.rotation);
  Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed);
  enemy.position = Vector2.Add(enemy.position, movement);
}

【讨论】:

  • 是的,将 if(rndDirection == 1,2,3,4) 更改为 0,1,2,3 就可以了
【解决方案2】:

rand.next 的参数是一个上限,除非您希望所有敌人始终一起移动,否则我会在 foreach 循环内为敌人重新计算随机向量,以便他们每个人都获得随机移动而不是全部执行相同的随机动作(除非那是你想要的)。

【讨论】:

  • 谢谢,确实遇到了这个问题,根据您的建议解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多