2015-12-08 13 views
0

Заранее спасибо. В настоящее время у меня есть спрайт, управляемый наклоном устройства и хотел бы, чтобы каждый так часто (NSTimer), чтобы еще один спрайт появился за ним, следуя за ним с той же физикой. Я настроил его, но мне нужно обновлять каждую секунду, чтобы он следил за ним. Как я могу это сделать? Это то, что я пробовал/сделал.Спрайты друг за другом

let snakeBodyY = snakeHead.position.y - 5 
    let snakeBodyX = snakeHead.position.x - 5 

    snakeHead = SKSpriteNode(imageNamed: "snakeHead") 
    snakeHead.size = CGSize(width: 60, height: 60) 
    snakeHead.position = CGPoint(x: self.frame.midX, y: self.frame.midY - 50) 
    self.addChild(snakeHead) 

    snakeBody = SKSpriteNode(imageNamed: "snakeBody") 
    snakeBody.size = CGSize(width: 50, height: 50) 
    snakeBody.position.x = snakeBodyX 
    snakeBody.position.y = snakeBodyY 
    self.addChild(snakeBody) 
+0

Я предлагаю вам использовать [ограничения расстояния] (https://developer.apple.com/library/mac/documentation/SpriteKit/Reference/SKConstraint_Ref/#//apple_ref/occ/clm/SKConstraint/distance: toNode :) – 0x141E

ответ

0

Зависит от того, как заранее вам это нужно,

если это свободный выбор 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-мя плитами, который допускает только вертикальное и горизонтальное перемещение, вы создаете массив ваших спрайтов, и каждый раз, когда ваша змея совершает движение, вы спускаете змею и меняете свое положение на предыдущую положение частей корпуса

+0

Как я мог бы это сделать или некоторые ссылки на учебники для вашего первого заявления. Спасибо –

+0

Я не знаю ни одного из рук, но позвольте мне уточнить свой ответ с некоторыми основами. – Knight0fDragon

+0

Спасибо вам большое за помощь Knight0fDragon! : D –

Смежные вопросы