Swift: приостановить бесконечную прокрутку фона (т.е. бесконечный цикл)

В моей игре я хотел бы, чтобы некоторые вещи приостанавливались при вызове функции «endGame», а другие продолжали работать. Я смог выполнить это для большинства действий, используя логическое значение «paused», но я не могу заставить его работать для моего фона прокрутки. Я знаю, что проблема связана с тем, как фоновое действие содержится в цикле for, но я не уверен, как это обойти. Вот пример моего кода:

class GameScene: SKScene {

var sun = SKSpriteNode()
var background = SKSpriteNode()

override func didMoveToView(view: SKView) {

sun = SKSpriteNode(imageNamed: "Sun")
    sun.zPosition = -2
    sun.setScale(0.8)
    sun.position = CGPoint(x: self.frame.size.width * 0.632, y: self.frame.size.height * 0.90)
    let rotate = SKAction.rotateByAngle(CGFloat(M_PI_2), duration: NSTimeInterval(10))
    let rotateForever = SKAction.repeatActionForever(rotate)
    sun.runAction(rotateForever)
    addChild(sun)

let backgroundTexture = SKTexture(imageNamed: "Background")
    backgroundTexture.filteringMode = .Nearest

    let moveBackground = SKAction.moveByX(-backgroundTexture.size().width, y: 0, duration: NSTimeInterval(0.004 * backgroundTexture.size().width * 2.0))
    let resetBackground = SKAction.moveByX(backgroundTexture.size().width, y: 0, duration: 0.0)
    let moveBackgroundForever = SKAction.repeatActionForever(SKAction.sequence([moveBackground,resetBackground]))

    for var i:CGFloat = 0; i < 4.0 + self.frame.size.width / ( backgroundTexture.size().width ); ++i {
        background = SKSpriteNode(texture: backgroundTexture)
        background.setScale(0.5)
        background.zPosition = -1
        background.position = CGPointMake(i * background.size.width, backgroundVert)
        background.runAction(moveBackgroundForever)
        addChild(background)
    }
}

func endGame {
sun.paused = true
background.paused = true
}
}

В этом примере логическое значение «paused» отлично работает для вращающегося узла SKSpriteNode с именем «sun», но не работает для фона. Какие-нибудь мысли?


person Grambo    schedule 01.12.2015    source источник


Ответы (2)


Что вам нужно сделать, так это создать 1 SKNode для ваших фоновых спрайтов, добавить все фоновые узлы к этому узлу, а затем добавить главный узел к вашей сцене. Затем, когда вам нужно сделать паузу, вы приостанавливаете только главный узел, а затем главный узел приостанавливает все свои дочерние узлы.

for var i:CGFloat = 0; i < 4.0 + self.frame.size.width / (backgroundTexture.size().width ); ++i {
    var background = SKSpriteNode(texture: backgroundTexture)
    background.setScale(0.5)
    background.zPosition = -1
    background.position = CGPointMake(i * background.size.width, backgroundVert)
    background.runAction(moveBackgroundForever)
    self.background.addChild(background)
}
addChild(background)
person Knight0fDragon    schedule 01.12.2015

Похоже, вы создаете несколько фонов в цикле for. Но вы делаете паузу только один.

person Stefan    schedule 01.12.2015