Зависит от того, как заранее вам это нужно,
если это свободный выбор 2D мира, который вы могли бы присвоить каждое новое тело к хвосту так, что позиции по отношению к змее, и всегда стараетесь чтобы части тела двигались в центр предыдущей части тела до головы.
Настройте свой спрайт, как это:
let snake = SKNode...
let head = SKSpriteNode...
let tail = SKSpriteNode...
//make sure you set up your positions for each body part, they should be relative to snake, not the screen
//setup collision so that tail and head can collide
head.physicsBody = SKPhysicsBody...
head.categoryBitMask = 1
head.collisionBitMask = 1
tail.physicsBody = SKPhysicsBody...
tail.categoryBitMask = 1
tail.collisionBitMask = 1
//setup restitution so that they do not bounce when colliding
head.restitution = 0
tail.restitution = 0
//add the parts to snake
snake.addChild(head)
snake.addChild(tail)
//Now you have a snake with a head and tail create an action to move the snake tail to the center of head
let moveToCenter = SKAction.moveTo(head.position, duration:0)
tail.runAction(moveToCenter)
//this will move the talk to try to get to the center of head, but collision physics will stop it from overlapping.
//Now everytime you want to add a new body
let body = SKSpriteNode...
body.physicsBody = SKPhysicsBody...
body.categoryBitMask = 1
body.collisionBitMask = 1
body.restitution = 0
snake.addChild(body)
let moveToCenter = SKAction.moveTo(tail.position, duration:0)
body.runAction(moveToCenter)
tail = body //lets make the tail the new piece to add
//Then on every update loop. you want to go through the children and do something like this
let previousChild = head
for child in snake.children
{
if child == head
{
continue;
}
child.removeAllActions()
let moveToCenter = SKAction.moveTo(previousChild.position, duration:0)
child.runAction(moveToCenter)
previousChild = child
}
Теперь, если вы обнаружите, что этот код может в конечном итоге работает медленно для вас, и не против более жесткой подход, вы можете также искать SKAction.followPath
. Теперь я не собираюсь вдаваться в подробности здесь, но в основном то, что вам нужно сделать, это записать, как движется ваша змея, затем вы создаете путь с ней и используете SKAction.followPath
, чтобы все части тела двигались по пути.
Если вы работаете в мире с 2-мя плитами, который допускает только вертикальное и горизонтальное перемещение, вы создаете массив ваших спрайтов, и каждый раз, когда ваша змея совершает движение, вы спускаете змею и меняете свое положение на предыдущую положение частей корпуса
Я предлагаю вам использовать [ограничения расстояния] (https://developer.apple.com/library/mac/documentation/SpriteKit/Reference/SKConstraint_Ref/#//apple_ref/occ/clm/SKConstraint/distance: toNode :) – 0x141E