Выберите случайное направление и двигайтесь

Я хочу иметь возможность выбрать случайный угол (от 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));
Другие вопросы по тегам