Перемещение фигурки палки, якоря, анимации или чего-то еще...?
Итак, я делаю игру с фигурками из палочек с cocos2d в цели c... Нужно анимировать разные вещи, поэтому, пожалуйста, дайте мне подсказку, как лучше всего выполнить движение для этих вещей:
Главный герой - он лучник в левом нижнем углу, который не двигается, за исключением того, что он переместит свою верхнюю часть тела, потому что вам нужно изменить угол, где вы снимаете угол...
Приближающиеся к вам враги - полчища фигур палочек, которые обнаруживают столкновения и умирают при попадании стрелы-спрайта.
Как мне сделать 1 и 2 ход? я должен освоить точки привязки и использовать их? (Я действительно ненавижу тупых привязчиков, их так трудно заставить работать... но я буду использовать их, если они лучше), или создаю тонны анимаций, или есть другой более простой способ объединить множество спрайтов в одно движение?
1 ответ
Мой общий совет: никогда, никогда не изменяйте стандартную точку привязки (0.5f, 0.5f), если у вас нет действительно хорошего понимания того, что она делает и как она помогает вам достигать целей. Во всех остальных случаях измените свойство position.
Особенно, если вы ограничивающий прямоугольник или обнаружение столкновения радиуса на основе, изменение точки привязки является непродуктивным.
Давайте предположим, что ваше прямоугольное изображение спрайта использует опорную точку по умолчанию, которая находится в центре текстуры:
._______.
| |
| |
| * |
| |
| |
°-------°
* Отмечает точку привязки текстуры. Если вы разместите этот спрайт в позиции (250, 100), то точка привязки спрайта будет в координатах (250, 100).
Допустим, вы перемещаете anchorPoint в (0.1f, 0.1f):
._______.
| |
. | . |
| |
| |
| * |
°-------°
° °
Положение спрайта остается неизменным в (250, 100). Положение anchorPoint также не меняется. Что меняется, так это то, как текстура центрирована вокруг этой точки. Вы можете увидеть предыдущую позицию изображения перед изменением точки привязки, посмотрев на плавающие точки. По сути, все, что вы делаете, изменяя anchorPoint, - это перемещаете (смещаете) там, где текстура узла рисуется относительно позиции узла.
В вышеприведенном случае текстура теперь центрируется так, чтобы ее нижний левый угол находился над позицией узла. Вы больше не можете полагаться на положение спрайта, отмечающего центр изображения спрайта. Если вы произвольно модифицируете anchorPoint для каждого узла в игре, у вас больше не будет никакой корреляции между визуальным представлением узла и его положением. Таким образом, плохой дизайн - модифицировать anchorPoint для объектов геймплея.
Кроме того, вращение или масштабирование всегда будут сосредоточены в точке привязки. Изменение anchorPoint может привести к нежелательному поведению при вращении или масштабировании узлов.
Давайте предположим странный, наихудший, но вполне возможный сценарий, когда anchorPoint больше не находится внутри текстуры:
._______.
| |
| |
| |
* | |
| |
°-------°
Это означает, что позиция этого спрайта смещена далеко влево от того места, где отображается фактическое изображение. Это может привести к несоответствиям проверки столкновений, в частности, описанная выше ситуация полностью аннулирует проверки столкновений на основе радиуса. Это также запутанная ситуация во время разработки.
Ваша игра будет намного легче развиваться, если вы будете уверены, что позиция спрайта всегда находится в центре его текстуры, а не какой-то произвольной точки, которую вы даже не можете увидеть без помощи отладочного рисунка.
Остается вопрос:
Когда вы хотите изменить опорную точку?
Я сделал это только в следующих ситуациях и избегаю этого во всех других сценариях:
- выровнять неанимированные текстуры по границам экрана / окна или аналогичным
- вправо / влево / сверху / снизу выровнять метку, кнопку или изображение
- выровнять измененное изображение (т.е. обновление художника) без изменения положения узла.
1) Легко объяснить. Предположим, у вас есть полноэкранное фоновое изображение. Чтобы он покрывал весь экран, вы можете сделать одну из двух вещей:
- изменить положение на: (ширина экрана / 2, высота экрана / 2)
- изменить точку привязки на (0, 0) или CGPointZero
Вы можете представить, что последнее легче сделать. Если вы никогда не будете перемещать фон, это нормально. Однако для прокрутки фона я бы не стал менять anchorPoint.
2) Предположим, ваши системные вызовы меню для различных кнопок и изображений должны быть выровнены по правому краю точно по правой границе экрана. Все кнопки и изображения различаются по ширине: например, Play Game, Credits, Settings, More Cool Games!
Вместо того, чтобы определять отдельные позиции для каждого изображения / кнопки, проще просто выровнять их по правому краю, изменив anchorPoint на (1.0f, 0.5f), а затем расположить изображения / кнопки точно на ширину экрана (и переменный экран). высота): позиция = (ширина экрана, 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 только в том случае, если это облегчает выравнивание узлов с другими узлами или границей экрана / окна, или для точной настройки конечного изображения без ущерба для игрового процесса.
Во всех остальных случаях используйте положение исключительно для перемещения узлов.