2015-03-23 3 views
1

Я делаю игру в Xcode 6, используя spriteKit и swift. У меня есть самолет на сцене, и чтобы он выглядел как его движение, я создаю облака со сцены слева от экрана. Затем я использую SKAction для перемещения облака в правую сторону экрана. Это отлично работает. Затем вы щелкаете, чтобы спрыгнуть с самолета, и самолет движется вверх по сцене. Затем я начинаю делать облака в нижней части сцены, затем они перемещаются вверху сцены, но проблема в том, что уже существующие облака все же должны перемещаться в правую сторону экрана. Мой вопрос заключается в том, как я могу сделать так, чтобы все существующие облака прекратили свое действие, которое перемещает их вправо, а затем начинают двигаться вверх именно там, где они есть? Как получить доступ к группе существующих облаков в одно и то же время после их создания? Я также хочу, чтобы облака замедлялись после того, как вы прыгнули, когда вы нажимаете экран, чтобы открыть свой парашют, но это должно быть сделано, закончив SKAction, который перемещает облака, а затем использует другой SKAction на них, который перемещает их медленнее , но я не знаю, как получить доступ к группе SKSpriteNodes.Как запустить SKAction в группе SKSpriteNodes с тем же именем?

Вот код, который я должен сделать облако:

//This is how the cloud is first declared at the top of the .swift file 
var cloud = SKSpriteNode() 

//This is the function that runs every certain interval through an NSTimer 
func createCloud() 
{ 
    cloud = SKSpriteNode(imageNamed: "cloud") 
    cloud.xScale = 1.25 

    cloud.yScale = cloud.xScale/2 
    cloud.zPosition = -1 
    self.addChild(cloud) 

    if personDidJump == false 
    { 
     let moveRight = SKAction.moveToX(CGRectGetWidth(self.frame) + CGRectGetWidth(cloud.frame), duration: cloudSpeed) 
     var apple = CGRectGetWidth(self.frame) 
     var randomNumber:CGFloat = CGFloat(arc4random_uniform(UInt32(apple))) 
     cloud.position = CGPointMake(-CGRectGetWidth(cloud.frame), randomNumber) 
     cloud.runAction(moveRight) 
    } 
    if personDidJump == true 
    { 
     let moveUp = SKAction.moveToY(CGRectGetHeight(self.frame) + CGRectGetWidth(cloud.frame), duration: cloudSpeed) 
     var apple = CGRectGetWidth(self.frame) 
     var randomNumber:CGFloat = CGFloat(arc4random_uniform(UInt32(apple))) 
     cloud.position = CGPointMake(randomNumber, -CGRectGetHeight(cloud.frame)) 
     cloud.runAction(moveUp) 
    } 
} 

Кроме того, я должен беспокоиться об удалении облака, когда они перемещаются со сценой? Или я могу просто оставить их там, потому что вы не можете их видеть, и из того, что я видел, они не отстают от вас. Любая помощь будет принята с благодарностью. Спасибо.

-Callum-

+0

Вы можете применить одно и то же действие к узлам с одинаковым именем, используя этот метод: http://stackoverflow.com/a/24213529/3402095 Об удалении узлов, когда они за кадром ... Я думаю, что узлы все еще потребляют ресурсы, даже если они за кадром потому что они все еще находятся в графе узлов. Но вы можете проверить это еще больше ... Также обратите внимание, что вы должны выяснить, как определить, когда узлы за кадром. Проверка позиции узлов в методе обновления иногда может быть не самым результативным способом. Решение для этого было бы иметь границу с той же contactTestBitMask и на обнаружение контакта, чтобы вы делали. – Whirlwind

+0

Спасибо. Мне было бы сложнее найти эту страницу, но это было странно, поэтому я не удивлен, что не нашел эту страницу при поиске решений. –

ответ

0

Положите облака в массив. Когда ваш игрок прыгает (или когда вам нужно переместить их), пробегите по массиву и выполните свое действие в каждом облаке.

+0

Спасибо за помощь, но решение «вихрь» показало мне: stackoverflow.com/a/24213529/3402095 работал хорошо. С этим я также могу легко изменить свойства узлов, как свойства физического тела, но спасибо за попытку помочь. –

0

stackoverflow.com/a/24213529/3402095

^Вот где я нашел мой answere^

Когда вы делаете узел дать ему имя:

myNode.name = "A Node Name" 
self.addChild(myNode) 

Если есть многие из этих узлов, позже вы можете изменить свойства или преформы SKAcions на этих узлах или сделать то, что вы хотите сделать, используя enumerateChildNodesWithName:

self.enumerateChildNodesWithName("A Node Name") 
{ 
    myNode, stop in 

    myNode.runAction(SKAction.moveToY(CGRectGetHeight(self.Frame), duration: 1) 
} 

Надеюсь, это полезно для тех, кто в этом нуждается.

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