Как мне заставить SKNode следовать за SKShapeNode в Sprite Kit?

#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:

Это сложная проблема. Я могу придумать два решения:

  1. Каждый раз, когда вы нажимаете и удерживаете, создавайте новый CGPath для следующего узла, который начинается с точки, в которой ваш узел в данный момент остановлен.

  2. Сохраните ссылку на объект SKAction, который вы запускаете. Когда вы перестанете нажимать на экран, вместо остановки действия установите для его speed свойства значение 0.0 . Это эффективно приостановит анимацию. При повторном нажатии установите скорость обратно на 1.0.

Комментарии:

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

2. Вы могли бы использовать -[SKAction reversedAction] , но это заставило бы вас с самого начала двигаться в другом направлении.

3. Да, я это заметил. Так что, я думаю, единственный вариант — каждый раз создавать новый путь или предлагать совершенно другой подход.