如何解决这个NSTimer问题?

时间:2015-08-10 02:39:14

标签: swift sprite-kit nstimer

一切都很好,直到我使用NSTimer来运行树,树的图像消失了。我使用SKview来显示物理然后我发现代码仍在运行,只是图像消失了。我该如何解决?

第1部分

class PlayScene: SKScene {

    var BG6 = SKSpriteNode()

    var balloon = SKSpriteNode()
    var tree1 = SKSpriteNode()
    var tree2 = SKSpriteNode()

第2部分

override func didMoveToView(view: SKView) {

        MakeBG()

        // add balloon

        var ballontexture = SKTexture(imageNamed: "Balloon.png")
        balloon = SKSpriteNode(texture: ballontexture)
        balloon.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/5)
        balloon.physicsBody = SKPhysicsBody(rectangleOfSize: balloon.size)
        balloon.physicsBody?.dynamic = true
        balloon.physicsBody?.allowsRotation = false
        balloon.zPosition = 5

        self.addChild(balloon)

        var timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("MakeTree"), userInfo: nil, repeats: true)

        var ground = SKNode()
        ground.position = CGPointMake(0, 0)
        ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width,1))
        ground.physicsBody?.dynamic = false



        self.addChild(ground)
}

第3部分

func MakeBG(){

        // chen hinh nen
        //BG1
        var BG1texture = SKTexture(imageNamed: "BG2")
        var BG1 = SKSpriteNode(texture: BG1texture)
        BG1.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2)
        BG1.size.height = self.size.height
        var BG1move = SKAction.moveToY(-self.frame.size.height, duration: 90)
        BG1.runAction(BG1move)
        self.addChild(BG1)

        //BG2
        var BG2texture = SKTexture(imageNamed: "BG3")
        var BG2 = SKSpriteNode(texture: BG2texture)
        BG2.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + self.frame.size.height)
        BG2.size.height = self.size.height
        var BG2move = SKAction.moveToY(-self.frame.size.height, duration: 140)
        BG2.runAction(BG2move)
        self.addChild(BG2)

        //BG3
        var BG3texture = SKTexture(imageNamed: "BG4")
        var BG3 = SKSpriteNode(texture: BG3texture)
        BG3.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + self.frame.size.height*2)
        BG3.size.height = self.size.height
        var BG3move = SKAction.moveToY(-self.frame.size.height, duration: 195)
        BG3.runAction(BG3move)
        self.addChild(BG3)

        //BG4
        var BG4texture = SKTexture(imageNamed: "BG5")
        var BG4 = SKSpriteNode(texture: BG4texture)
        BG4.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + self.frame.size.height*3)
        BG4.size.height = self.size.height
        var BG4move = SKAction.moveToY(-self.frame.size.height, duration: 250)

        BG4.runAction(BG4move)
        self.addChild(BG4)

        //BG5
        var BG5texture = SKTexture(imageNamed: "BG6")
        var BG5 = SKSpriteNode(texture: BG5texture)
        BG5.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + self.frame.size.height*4)
        BG5.size.height = self.size.height
        var BG5move = SKAction.moveToY(-self.frame.size.height, duration: 305)

        BG5.runAction(BG5move)
        self.addChild(BG5)

        // BG6

        var BG6texture = SKTexture(imageNamed: "BG7")
        BG6 = SKSpriteNode(texture: BG6texture)

        BG6.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2 + self.frame.size.height*5 + self.frame.size.height*5)
        BG6.size.height = self.size.height

        BG6.runAction(SKAction.moveTo(CGPoint(x: self.size.width/2 , y: self.size.height/2), duration: 276.5))


        self.addChild(BG6)

    }

    func MakeTree(){


            // between

            let between = balloon.size.width
            // random
            var movementAmount = arc4random() % UInt32(self.frame.size.height/2)
            var treeoffset = CGFloat(movementAmount) - self.frame.size.height/4
            // move tree

            var treemove = SKAction.moveByX(0, y: -self.frame.size.width*2, duration: NSTimeInterval(self.frame.size.height/50))
            var treeremove = SKAction.removeFromParent()
            var treemoveandremove = SKAction.sequence([treemove, treeremove])

            // add tree1

            var tree1texture = SKTexture(imageNamed: "C2.png")
            tree1 = SKSpriteNode(texture: tree1texture)
            tree1.position = CGPointMake(CGRectGetMidX(self.frame) - tree1texture.size().width/2 - between + treeoffset, CGRectGetMidY(self.frame) + self.frame.size.height)
            tree1.runAction(treemoveandremove)
            tree1.physicsBody = SKPhysicsBody(rectangleOfSize: tree1.size)
            tree1.physicsBody?.dynamic = false


            self.addChild(tree1)

            // add tree2

            var tree2texture = SKTexture(imageNamed: "C1.png")
            tree2 = SKSpriteNode(texture: tree2texture)
            tree2.position = CGPointMake(CGRectGetMidX(self.frame) + tree2texture.size().width/2 + between + treeoffset, CGRectGetMidY(self.frame) + self.frame.size.height)
            tree2.runAction(treemoveandremove)
            tree2.physicsBody = SKPhysicsBody(rectangleOfSize: tree2.size)
            tree2.physicsBody?.dynamic = false
        [enter image description here][1]
            self.addChild(tree2)



    }

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么你想知道为什么你的“树”消失了。

看来你的MakeTree()方法将所有树精灵节点移出屏幕:

    var treemove = SKAction.moveByX(0, y: -self.frame.size.width*2, duration: NSTimeInterval(self.frame.size.height/50))

此外,您不应该在SpriteKit中使用NSTimers。请改用SKAction.waitForDuration。像这样:

let delay = SKAction.waitForDuration(3)
someNode.runAction(delay) {

    //run code here after 3 seconds

}