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

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

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

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

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

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

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

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

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

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

Предположим, вы перемещаете anchorPoint в (0,1f, 0,1f):

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

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

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

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

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

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

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

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

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

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

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

  1. выравнивание неанимированных текстур с границами экрана / windows или аналогичные
  2. справа / слева / сверху / снизу выровняйте ярлык, кнопку или изображение
  3. для выравнивания измененного изображения (например, обновление художника) без изменения положения узла.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В итоге:

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

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

  • Синглтон в iOS 5?
  • Почему NSError нуждается в двойной косвенности? (указатель на указатель)
  • как скрыть навигационную панель, когда я нажимаю навигационный controller?
  • Восстановить пре-iOS7 UINavigationController pushViewController animation
  • Как настроить размер содержимого UIScrollView динамически
  • Можем ли мы пригласить людей использовать наше приложение или отправить запрос друга из приложения через Facebook в iOS 5?
  • Запустите NSRunLoop в командной строке программы Cocoa
  • Объектив-C Категория Причинение непризнанного селектора
  • UIImage imageNamed требует pathForResource?
  • Создать случайное число в пределах диапазона?
  • Формат NSDate, выводящий неверную дату
  • Давайте будем гением компьютера.