Перемещение фигурки палки, якоря, анимации или чего-то еще ...? - PullRequest
11 голосов
/ 18 октября 2011

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

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

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

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

1 Ответ

45 голосов
/ 18 октября 2011

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

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

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

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

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

Допустим, вы перемещаете anchorPoint в (0.1f, 0.1f):

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

°       ° 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2) Предположим, что системные вызовы вашего меню позволяют выровнять различные кнопки и изображения по правому краю экрана. Все кнопки и изображения различаются по ширине: например, играть в игры, кредиты, настройки, более интересные игры!

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

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

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

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

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

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

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

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

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

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

В итоге:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...