Множество способов сделать это.Сравнение позиций узлов (лидер / последователь) на регулярной основе и обновление позиций соответственно должно работать.Пример: лидер идет на некоторые позиции> позиции не совпадают> переместить последователя в местоположение лидера.
Пример кода
class GameScene: SKScene {
private var leader: SKSpriteNode!
private var follower: SKSpriteNode!
override func didMove(to view: SKView) {
self.leader = SKSpriteNode(color: UIColor.red, size: CGSize(width: 30, height: 30))
self.follower = SKSpriteNode(color: UIColor.green, size: CGSize(width: 30, height: 30))
self.addChild(leader)
self.addChild(follower)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches {
let target = t.location(in: self)
// Move the leader to the touch location
leader.run(SKAction.move(to: target, duration: 1), withKey: "moving")
}
}
override func update(_ currentTime: TimeInterval) {
// Check positions
if follower.position != leader.position {
// Check if the follower has a 'following' action already
if follower.action(forKey: "following") == nil {
// Move the follower
follower.run(SKAction.move(to: leader.position, duration: 1), withKey: "following")
}
}
}
}
Обратите внимание, что действие обновления вызывается один раз за кадр, что может быть слишком много.В зависимости от вашей ситуации, вы можете создать какой-то цикл, который будет вызываться каждую секунду.
Другим способом было бы всегда выполнять одно и то же действие на следующем узле (возможно, с более длительной продолжительностью, такой, что вы можете на самом делесм. следующий узел).
Редактировать: Подробнее о коллизиях: Не могу понять, как работает битовая маска коллизий (просто убедитесь, что они имеют разные битовые маски контактов - т. Е. 0b01 и 0b10 и не находятся в коллизиях друг другабитовая маска)