我正在做一个自上而下的射手,我希望我的敌人漫无目的地四处游荡。在这段代码中,我有一个Enemy类,包含所有变量(旋转,位置等),包括主类中的随机(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#的新手,所以我可能缺乏一些关于它是如何运作的知识,那么有人可能会指出我正确的方向吗?
答案 0 :(得分:4)
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);
}
答案 1 :(得分:1)
rand.next的参数是一个上限,除非你想让你所有的敌人总是一起移动我会重新计算foreach循环内部随机向量的敌人,这样他们每个人都会得到一个随机的动作,而不是所有表演相同的随机运动(除非那就是你想要的)。