Выберите случайное направление и двигайтесь
Я хочу иметь возможность выбрать случайный угол (от 0 до 360 или от 0 до 2pi), а затем сделать движение спрайта в этом направлении. До сих пор я пробовал это, но это было довольно неэффективно, так как оно всегда движется вниз, и выбор угла не очень хорош.
Random rand = new Random();
//Chooses the Angle
rotation = (float)rand.NextDouble()*MathHelper.TwoPi;
//Is supposed to get a normalized movement vector that moves in the direction of that angle.
moveVector = Vector2.Normalize(new Vector2(-(float)Math.Tan(rotation), 1));
2 ответа
Кажется, вам не хватает тригонометрии:
Вы создаете вектор с компонентом Y, который всегда равен 1 (вниз в 2D XNA). Таким образом, независимо от случайного угла, он влияет только на горизонтальную часть направления.
Чтобы превратить угол в (единичный, т.е. уже нормализованный) вектор направления, вы можете использовать sin и cos (представьте себе единичный круг):
var dir = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
Так как XNA помещает начало координат в верхнем левом углу экрана для 2D, вам нужно повернуть вспять компонент y:
var dir = new Vector2((float)Math.Cos(angle), -(float)Math.Sin(angle));
Кроме того, чтобы убедиться, что вы получаете правильную последовательность случайных чисел, вы должны создать случайный объект только один раз, а затем каждый раз использовать один и тот же экземпляр для получения следующего случайного числа.
Кроме того, чтобы получить более плавное движение, вы можете либо взвесить направление в сторону того направления, в котором вы уже движетесь, либо выбрать случайный пункт назначения и поехать к нему (затем выбрать другой и т. Д.).
Разобрался, это правильная строка:
move = new Vector2((float)Math.Cos(rotation - MathHelper.PiOver2), (float)Math.Sin(rotation - MathHelper.PiOver2));