#ios #objective-c #sprite-kit
#iOS #objective-c #sprite-kit
Вопрос:
У меня есть линия, скажем, округлый прямоугольник, нарисованный на экране (SKShapeNode, взятый из CGPath). Теперь я хочу, чтобы узел следовал за этим округленным прямоугольником по часовой стрелке или против часовой стрелки. Я сделал это с помощью SKAction followPath:asOffset:orientToPath:duration: метод, который отлично работает, если узел начинается с начала пути.
Дело в том, что узел может быть размещен в любом месте округленной прямой, и когда я нажимаю и удерживаю кнопку, я хочу, чтобы он начинал следовать за прямой с точки, в которой он находится в данный момент. Когда я отпускаю кнопку, узел останавливается там, где он есть. Прямо сейчас, если я остановлю узел и запущу его снова, он следует за новым округленным прямоугольником, начинающимся в точке узлов.
Есть ли простой способ добиться этого?
Ответ №1:
Кажется, вы можете использовать недавно представленный класс SKConstraint (https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKConstraint_Ref/).
Для краткого ознакомления взгляните на сессию 606 из WWDC2014: «Что нового в SpriteKit».
Это действительно быстрый и простой способ настроить положение / поворот / расстояние спрайта по отношению к другому спрайту.
Что вам точно нужно, так это
(instancetype)orientToNode:(SKNode *)node
offset:(SKRange *)radians
Комментарии:
1. Возможно, с этим можно что-то сделать, проверим это.
Ответ №2:
Это сложная проблема. Я могу придумать два решения:
-
Каждый раз, когда вы нажимаете и удерживаете, создавайте новый CGPath для следующего узла, который начинается с точки, в которой ваш узел в данный момент остановлен.
-
Сохраните ссылку на объект SKAction, который вы запускаете. Когда вы перестанете нажимать на экран, вместо остановки действия установите для его
speed
свойства значение0.0
. Это эффективно приостановит анимацию. При повторном нажатии установите скорость обратно на 1.0.
Комментарии:
1. Это отлично работает, пока он продолжает двигаться в том же направлении. Установка скорости на -1, похоже, не работает, поэтому я предполагаю, что мне нужно создавать новый CGPath каждый раз, когда меняется направление?
2. Вы могли бы использовать
-[SKAction reversedAction]
, но это заставило бы вас с самого начала двигаться в другом направлении.3. Да, я это заметил. Так что, я думаю, единственный вариант — каждый раз создавать новый путь или предлагать совершенно другой подход.