Перемещение фигуры Stick, опорных точек, анимации или чего-то еще...?

Хорошо, поэтому я делаю игру с фигурками с cocos2d в объективе c... Разные вещи должны быть анимированы, поэтому, пожалуйста, дайте мне предложение о том, какой был бы лучший способ добиться движения за эти вещи:

  • Главный герой - он лучник в левом нижнем углу, который не перемещается, за исключением того, что он переместит верхнюю часть тела, потому что вам нужно изменить угол, где вы стреляете в угол...

  • Враги - орды фигур палки, приходящие на вас, которые обнаруживают столкновение и умирают, когда стреляют стрелой.

Как мне сделать 1 и 2? должен ли я осваивать опорные точки и использовать их? (Я действительно ненавижу глупые опорные точки, с которыми им так трудно работать... но я буду использовать их, если они будут лучше) или создавать тонны анимаций, или есть еще один более простой способ объединить множество спрайтов в одно движение?

Ответ 1

Мой общий совет: никогда, никогда не изменяйте по умолчанию anchorPoint (0.5f, 0.5f), если у вас нет действительно хорошего понимания того, что он делает, и как он помогает вам в достижении. Во всех остальных случаях измените свойство position.

Особенно, если вы ограничивающая обнаружению коробки или на основе столкновения радиуса, изменение точки привязки является непродуктивным.

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

._______.
|       |
|       |
|   *   |
|       |
|       |
°-------°

* обозначает привязку текстуры. Если вы разместите этот спрайт в позиции (250, 100), то опорный указатель спрайта будет находиться в координатах (250, 100).

Скажем, вы перемещаете anchorPoint в (0.1f, 0.1f):

  ._______.
  |       |
. |     . |
  |       |
  |       |
  | *     |
  °-------°

°       ° 

Положение спрайта остается неизменным (250, 100). Позиция anchorPoint также не изменяется. Какие изменения связаны с тем, как текстура сосредоточена вокруг этой точки. Перед изменением точки привязки вы можете увидеть предыдущую позицию изображения, посмотрев на плавающие точки. Фактически, все, что вы делаете, изменяя anchorPoint, - это перемещение (смещение), где текстура node отображается относительно позиции node.

В приведенном выше случае текстура теперь центрирована с ее нижним левым углом над положением node. Вы больше не можете полагаться на положение спрайта, обозначающего центр спрайта. Если вы произвольно изменяете anchorPoint для каждого node в игре, у вас больше нет корреляции между визуальным представлением node и его позицией. Таким образом, плохой дизайн модифицирует anchorPoint для объектов игрового процесса.

Кроме того, поворот или масштабирование всегда будут центрироваться на anchorPoint. Изменение привязки может привести к нежелательному поведению при вращении или масштабировании узлов.

Предположим, что нечетный, худший случай, но вполне возможный сценарий, когда anchorPoint больше не находится внутри текстуры:

                     ._______.
                     |       |
                     |       |
                     |       |
  *                  |       |
                     |       |
                     °-------°

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

Ваша игра будет намного легче развиваться, если вы можете быть уверены, что позиция спрайта всегда находится в центре ее текстуры, а не какая-то произвольная точка, которую вы даже не видите без помощи какого-то отладочного чертежа.

Остается вопрос:

Когда вы хотите изменить опорную точку?

Я сделал это только в следующих ситуациях и избегал этого во всех других сценариях:

  • для выравнивания неанимированных текстур с границами экрана/окна или аналогичными
  • вправо/влево/сверху/снизу выравнивание метки, кнопки или изображения
  • чтобы выровнять измененное изображение (то есть обновление художника) без изменения позиции node.

1) Легко объяснить. Предположим, у вас полноэкранное фоновое изображение. Чтобы он охватывал весь экран, вы можете сделать одну из двух вещей:

  • измените положение на: (ширина экрана /2, экран высота /2)
  • изменить anchorPoint на (0, 0) aka CGPointZero

Вы можете себе представить, что последнее легче сделать. Если вы никогда не будете перемещать фон, это прекрасно. Однако для прокрутки фона я бы не изменил anchorPoint.

2) Предположим, что ваши системные вызовы меню для различных кнопок и изображений выравниваются по правому краю точно с правой границей экрана. Все кнопки и изображения различаются по ширине: Play Game, Credits, Settings, More Cool Games!

Вместо того, чтобы определять отдельные позиции для каждого изображения/кнопки, проще просто выровнять их по правому краю, изменив привязку anchorPoint на (1.0f, 0.5f), а затем поместите изображения/кнопки точно на ширину экрана ( и переменной высоты экрана): position = (ширина экрана, 100).

Предположим, что следующая позиция изображения находится на (ширина экрана, высота экрана /2) с по умолчанию anchorPoint (0.5f, 0.5f). Вы можете видеть, что правая половина изображения находится за пределами области экрана:

__________.
          |
      .___|___.
      |   |   |
      |   |   |
      |   *   |
      |   |   |
      |   |   |
      °---|---°
          |
----------°

С измененным anchorPoint (1.0f, 0.5f) изображение может быть аккуратно выровнено по правому краю экрана/окна независимо от ширины его текстуры. Позиция остается той же: (ширина экрана, высота экрана /2).

__________.
          |
  ._______.
  |       |
  |       |
  |       *
  |       |
  |       |
  °-------°
          |
----------°

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

(screen width - contentSize.width * anchorPoint.x, screen height / 2)

Формула все еще довольно проста, однако, если размер contentSize из node изменяется, что часто бывает для ярлыков, например, оценка начинается с 1 цифры, но увеличивается до 2, 3 и 4 цифр со временем. В таких случаях выравнивание по правому краю a node путем модификации anchorPoint оправдано, поскольку оно позволяет избежать пересчета позиции каждый раз, когда изменяется размер contentSize node.

3) Есть редкие случаи, когда художник предоставил мне обновленное изображение игрового объекта. Размер изображения изменился, поэтому он больше не вписывается в графику игры. С другой стороны, позиция объекта уже была хорошо установлена ​​с помощью тестирования игрового процесса и не должна меняться, чтобы избежать повторной проверки игры.

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

Вкратце:

Изменить anchorPoint только в том случае, если упростить выравнивание узлов с другими узлами или границу экрана/окна или тонкую настройку окончательного искусства без влияния на игровой процесс.

Во всех остальных случаях использовать позицию исключительно для перемещения узлов.