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