Статьи

Круговое движение в AS3: заставьте один движущийся объект вращаться вокруг другого

Наличие одного объекта на орбите другого — это механика движения, которая использовалась с ранней игровой эры, и она остается удобной до сегодняшнего дня! В этом кратком совете мы рассмотрим математическую функцию орбиты, посмотрим, как ее изменить, и рассмотрим практическое использование в реальном игровом дизайне.


Вот к чему мы будем стремиться:


Чтобы создать орбиту, мы должны определить следующее:

  • Происхождение — объект или позиция, на которой сосредоточена орбита.
  • Орбитер — объект, который вращается вокруг источника.
  • Угол — Текущий угол орбитального аппарата.
  • Скорость — количество пикселей, которые наш объект вращает вокруг кадра.
  • Радиус — расстояние орбитального спутника от начала координат.

Также полезно отметить, что система координат Flash похожа на обычную декартову плоскость , за исключением того, что ось y перевернута, поэтому значение увеличивается при движении вниз. Верхний левый угол сцены имеет координаты (0,0)

сетка
На этом изображении 0, 90, 180 и 270 относятся к углам, измеренным в градусах.

Еще одна вещь, которую нам нужно понять, — это как преобразовать градусы в радианы, что можно легко сделать с помощью следующей формулы:

Radians = Degrees * (PI / 180)

Вот фактическая функция орбиты: для нее требуется две линии: одна для позиционирования орбитального аппарата на оси x, а другая для позиционирования на оси y:

Орбитер X-Coord = Источник X-Coord + Радиус * cos (Радианы)

Орбитер Y-Coord = Источник Y-Coord + Радиус * sin (Радианы)

(В нормальной декартовой плоскости sin используется для x-координаты, а cos используется для y-координаты, но поскольку наши углы увеличиваются по часовой стрелке — из-за перевернутой оси y — их места меняются местами.)


Теперь мы можем превратить логику в реальный код, который мы можем использовать. Сначала объявите все переменные:

1
2
3
4
5
public var orbiter:Orbiter = new Orbiter();
public var origin:Origin = new Origin();
public var angle:Number = 0;
public var speed:Number = 3;
public var radius:Number = 75;

Затем перепишите уравнение для использования в AS3 и поместите его в ENTER_FRAME обработчик события ENTER_FRAME :

1
2
3
var rad:Number = angle * (Math.PI / 180);
orbiter.x = origin.x + radius * Math.cos(rad);
orbiter.y = origin.y + radius * Math.sin(rad);

Если вы проверите сейчас, ничего не произойдет; это потому, что переменный угол не увеличивается и не уменьшается. Поэтому мы должны увеличить или уменьшить значение:

1
2
angle += speed;
angle -= speed;

А что, если мы хотим, чтобы наш орбитальный аппарат постоянно находился в одном направлении? Ну, я написал уравнение, чтобы сделать это!

1
orbiter.rotation = (Math.atan2(orbiter.y-origin.y, orbiter.x-origin.x) * 180 / Math.PI);

В зависимости от того, каким образом вы нарисовали свой видеоклип на орбите, вам, возможно, придется вычесть определенный угол (вне скобок), чтобы заставить его смотреть в правильном направлении.


Теперь это может показаться сумасшедшим, но некоторые из нас могут захотеть, чтобы наша орбита объекта была в виде эллипса. Это легко выполнимо; все, что нам нужно сделать, это умножить в определенном месте в уравнении. Умножение функций cos или sin на положительное целое число приведет к растяжению круга. Умножение на десятичное число от 0 до 1 приведет к сжатию. И умножение его на отрицательное заставит его перевернуться вдоль этой оси:

1
2
3
(2 * Math.cos(rad));
(0.5 * Math.sin(rad));
(-3 * Math.cos(rad));

Мы также можем сместить орбиту в любом желаемом направлении, добавив или вычтя из уравнения на любой оси:

1
orbiter.x = (origin.x + radius * Math.cos(rad))-50;

Если вы хотите узнать больше о cos , sin и atan2 , взгляните на Trigonometry для разработчиков Flash .


Теперь все в порядке, но для чего это может быть использовано? Большое разнообразие вещей на самом деле!

Если бы вы когда-нибудь играли в Mario Kart, вы бы получили «три снаряда» powerup; эти снаряды вращаются, используя эту самую технику. Другим примером является широко используемая игра в круг-понг, где весло вращается вдоль кольца снаружи. Третий пример — сверху вниз игры с зомби-шутерами: многие из них включают в себя усиление, где группа бочек вращается вокруг вашего игрока и разбивает любых зомби, если их бьют, пытаясь напасть на вас.

Как вы можете видеть, использование этой техники может использоваться во всем, от стандартных игр до казуальных игр.


Спасибо, что нашли время, чтобы изучить этот краткий совет! Если у вас есть какие-либо вопросы, оставьте комментарий ниже.