Sprite Kit不会停止添加节点

时间:2016-08-09 13:16:18

标签: ios swift sprite-kit

在我的项目中,一切都很顺利,效果很好,除非我想在游戏中发生特定事件时添加SKLabelNode的1个实例。
然后问题是当事件发生时它不止一次地添加SKLabelNode并且它继续进行成千上万...

这是我的代码:

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate{

var isTouched: Bool = false
let lavaRoom = SKSpriteNode(imageNamed: "LavaRom")
let tileStone1 = SKSpriteNode(imageNamed: "TileStone")
let tileStone2 = SKSpriteNode(imageNamed: "TileStone")
let tileStone3 = SKSpriteNode(imageNamed: "TileStone")
let tileStone4 = SKSpriteNode(imageNamed: "TileStone")
let tileStone5 = SKSpriteNode(imageNamed: "TileStone")
let tileStone6 = SKSpriteNode(imageNamed: "TileStone")
let tileStone7 = SKSpriteNode(imageNamed: "TileStone")
let tileStone8 = SKSpriteNode(imageNamed: "TileStone")
let tileStone9 = SKSpriteNode(imageNamed: "TileStone")
let tileStone10 = SKSpriteNode(imageNamed: "TileStone")
let tileStone11 = SKSpriteNode(imageNamed: "TileStone")
let tileStone12 = SKSpriteNode(imageNamed: "TileStone")
let tileStone13 = SKSpriteNode(imageNamed: "TileStone")
let tileStone14 = SKSpriteNode(imageNamed: "TileStone")
let tileStone15 = SKSpriteNode(imageNamed: "TileStone")
let tileStone16 = SKSpriteNode(imageNamed: "TileStone")
let tileStone17 = SKSpriteNode(imageNamed: "TileStone")
let tileStone18 = SKSpriteNode(imageNamed: "TileStone")
let tileStone19 = SKSpriteNode(imageNamed: "TileStone")
let tileStone20 = SKSpriteNode(imageNamed: "TileStone")
let tileStone21 = SKSpriteNode(imageNamed: "TileStone")
let tileStone22 = SKSpriteNode(imageNamed: "TileStone")
let tileStone23 = SKSpriteNode(imageNamed: "TileStone")
let tileStone24 = SKSpriteNode(imageNamed: "TileStone")
let tileStone25 = SKSpriteNode(imageNamed: "TileStone")
let tileStone26 = SKSpriteNode(imageNamed: "TileStone")
let tileStone27 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop1 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop2 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop3 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop4 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop5 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop6 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop7 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop8 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop9 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop10 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop11 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop12 = SKSpriteNode(imageNamed: "TileStone")
let tileStoneTop13 = SKSpriteNode(imageNamed: "TileStone")

let player = SKSpriteNode(imageNamed: "PlayerBox")

let enemyBox = SKSpriteNode(imageNamed: "TileStone")

let playerInt : UInt32 = 0
let enemyInt : UInt32 = 1

override func didMoveToView(view: SKView) {

    let invisibleNode = SKShapeNode(rect: CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height))
    invisibleNode.name = "box"
    invisibleNode.fillColor = SKColor.redColor()
    invisibleNode.strokeColor = SKColor.clearColor()

    self.addChild(invisibleNode)

    self.backgroundColor = UIColor(hue: 0.0194, saturation: 0.66, brightness: 0.89, alpha: 1.0)

    player.size = CGSize(width: 50, height: 50)
    player.position = CGPointMake(self.frame.size.width / 2 - 350, 190)
    player.anchorPoint = CGPointZero
    player.zPosition = 2
    addChild(player)        

    enemyBox.size = CGSize(width: 50, height: 50)
    enemyBox.position = CGPointMake(self.frame.size.width / 2, 215)
    enemyBox.zPosition = 2
    addChild(enemyBox)


    tileStone1.size = CGSize(width: 100, height: 100)
    tileStone1.anchorPoint = CGPointZero
    tileStone1.position = CGPoint(x: 0, y: 90)
    tileStone1.zPosition = 2

    addChild(tileStone1)
    tileStone2.size = CGSize(width: 100, height: 100)
    tileStone2.zPosition = 2

    tileStone2.anchorPoint = CGPointZero
    tileStone2.position = CGPoint(x: 100, y: 90)
    addChild(tileStone2)
    tileStone3.size = CGSize(width: 100, height: 100)
    tileStone3.zPosition = 2

    tileStone3.anchorPoint = CGPointZero
    tileStone3.position = CGPoint(x: 200, y: 90)
    addChild(tileStone3)
    tileStone4.size = CGSize(width: 100, height: 100)
    tileStone4.zPosition = 2
    tileStone4.anchorPoint = CGPointZero
    tileStone4.position = CGPoint(x: 300, y: 90)

    addChild(tileStone4)
    tileStone5.size = CGSize(width: 100, height: 100)
    tileStone5.anchorPoint = CGPointZero
    tileStone5.position = CGPoint(x: 400, y: 90)
    tileStone5.zPosition = 2

    addChild(tileStone5)
    tileStone6.size = CGSize(width: 100, height: 100)
    tileStone6.anchorPoint = CGPointZero
    tileStone6.position = CGPoint(x: 500, y: 90)
    tileStone6.zPosition = 2

    addChild(tileStone6)
    tileStone7.size = CGSize(width: 100, height: 100)
    tileStone7.anchorPoint = CGPointZero
    tileStone7.position = CGPoint(x: 600, y: 90)
    tileStone7.zPosition = 2

    addChild(tileStone7)
    tileStone8.size = CGSize(width: 100, height: 100)
    tileStone8.anchorPoint = CGPointZero
    tileStone8.position = CGPoint(x: 700, y: 90)
    tileStone8.zPosition = 2

    addChild(tileStone8)
    tileStone9.size = CGSize(width: 100, height: 100)
    tileStone9.anchorPoint = CGPointZero
    tileStone9.position = CGPoint(x: 800, y: 90)
    tileStone9.zPosition = 2

    addChild(tileStone9)
    tileStone10.size = CGSize(width: 100, height: 100)
    tileStone10.anchorPoint = CGPointZero
    tileStone10.position = CGPoint(x: 900, y: 90)
    tileStone10.zPosition = 2
    addChild(tileStone10)

    addChild(tileStone11)
    tileStone11.size = CGSize(width: 100, height: 100)
    tileStone11.anchorPoint = CGPointZero
    tileStone11.position = CGPoint(x: 1000, y: 90)
    tileStone11.zPosition = 2


    tileStone12.size = CGSize(width: 100, height: 100)
    tileStone12.anchorPoint = CGPointZero
    tileStone12.position = CGPoint(x: 1100, y: 90)
    tileStone12.zPosition = 2
    addChild(tileStone12)

    tileStone13.size = CGSize(width: 100, height: 100)
    tileStone13.anchorPoint = CGPointZero
    tileStone13.position = CGPoint(x: 1200, y: 90)
    tileStone13.zPosition = 2
    addChild(tileStone13)

    tileStone14.size = CGSize(width: 100, height: 100)
    tileStone14.anchorPoint = CGPointZero
    tileStone14.position = CGPoint(x: 1300, y: 90)
    tileStone14.zPosition = 2
    addChild(tileStone14)


    tileStone15.size = CGSize(width: 100, height: 100)
    tileStone15.anchorPoint = CGPointZero
    tileStone15.position = CGPoint(x: 1400, y: 90)
    tileStone15.zPosition = 2
    addChild(tileStone15)


    tileStone16.size = CGSize(width: 100, height: 100)
    tileStone16.anchorPoint = CGPointZero
    tileStone16.position = CGPoint(x: 1500, y: 90)
    tileStone16.zPosition = 2
    addChild(tileStone16)


    tileStone17.size = CGSize(width: 100, height: 100)
    tileStone17.anchorPoint = CGPointZero
    tileStone17.position = CGPoint(x: 1600, y: 90)
    tileStone17.zPosition = 2
    addChild(tileStone17)

    tileStone18.size = CGSize(width: 100, height: 100)
    tileStone18.anchorPoint = CGPointZero
    tileStone18.position = CGPoint(x: 1700, y: 90)
    tileStone18.zPosition = 2
    addChild(tileStone18)

    tileStone19.size = CGSize(width: 100, height: 100)
    tileStone19.anchorPoint = CGPointZero
    tileStone19.position = CGPoint(x: 1800, y: 90)
    tileStone19.zPosition = 2
    addChild(tileStone19)

    tileStone20.size = CGSize(width: 100, height: 100)
    tileStone20.anchorPoint = CGPointZero
    tileStone20.position = CGPoint(x: 1900, y: 90)
    tileStone20.zPosition = 2
    addChild(tileStone20)

    tileStone21.size = CGSize(width: 100, height: 100)
    tileStone21.anchorPoint = CGPointZero
    tileStone21.position = CGPoint(x: 2000, y: 90)
    tileStone21.zPosition = 2
    addChild(tileStone21)

    tileStone22.size = CGSize(width: 100, height: 100)
    tileStone22.anchorPoint = CGPointZero
    tileStone22.position = CGPoint(x: 2100, y: 90)
    tileStone22.zPosition = 2
    addChild(tileStone22)

    tileStoneTop1.size = CGSize(width: 100, height: 100)
    tileStoneTop1.anchorPoint = CGPointZero
    tileStoneTop1.position = CGPoint(x: 0, y: 580)
    tileStoneTop1.zPosition = 2

    addChild(tileStoneTop1)
    tileStoneTop2.size = CGSize(width: 100, height: 100)
    tileStoneTop2.zPosition = 2

    tileStoneTop2.anchorPoint = CGPointZero
    tileStoneTop2.position = CGPoint(x: 100, y: 580)
    addChild(tileStoneTop2)
    tileStoneTop3.size = CGSize(width: 100, height: 100)
    tileStoneTop3.zPosition = 2

    tileStoneTop3.anchorPoint = CGPointZero
    tileStoneTop3.position = CGPoint(x: 200, y: 580)
    addChild(tileStoneTop3)
    tileStoneTop4.size = CGSize(width: 100, height: 100)
    tileStoneTop4.zPosition = 2
    tileStoneTop4.anchorPoint = CGPointZero
    tileStoneTop4.position = CGPoint(x: 300, y: 580)

    addChild(tileStoneTop4)
    tileStoneTop5.size = CGSize(width: 100, height: 100)
    tileStoneTop5.anchorPoint = CGPointZero
    tileStoneTop5.position = CGPoint(x: 400, y: 580)
    tileStoneTop5.zPosition = 2

    addChild(tileStoneTop5)
    tileStoneTop6.size = CGSize(width: 100, height: 100)
    tileStoneTop6.anchorPoint = CGPointZero
    tileStoneTop6.position = CGPoint(x: 500, y: 580)
    tileStoneTop6.zPosition = 2

    addChild(tileStoneTop6)
    tileStoneTop7.size = CGSize(width: 100, height: 100)
    tileStoneTop7.anchorPoint = CGPointZero
    tileStoneTop7.position = CGPoint(x: 600, y: 580)
    tileStoneTop7.zPosition = 2

    addChild(tileStoneTop7)
    tileStoneTop8.size = CGSize(width: 100, height: 100)
    tileStoneTop8.anchorPoint = CGPointZero
    tileStoneTop8.position = CGPoint(x: 700, y: 580)
    tileStoneTop8.zPosition = 2

    addChild(tileStoneTop8)
    tileStoneTop9.size = CGSize(width: 100, height: 100)
    tileStoneTop9.anchorPoint = CGPointZero
    tileStoneTop9.position = CGPoint(x: 800, y: 580)
    tileStoneTop9.zPosition = 2

    addChild(tileStoneTop9)
    tileStoneTop10.size = CGSize(width: 100, height: 100)
    tileStoneTop10.anchorPoint = CGPointZero
    tileStoneTop10.position = CGPoint(x: 900, y: 580)
    tileStoneTop10.zPosition = 2

    addChild(tileStoneTop10)
    tileStoneTop11.size = CGSize(width: 150, height: 100)
    tileStoneTop11.anchorPoint = CGPointZero
    tileStoneTop11.position = CGPoint(x: 1000, y: 580)
    tileStoneTop11.zPosition = 2

    addChild(tileStoneTop11)
    tileStoneTop12.size = CGSize(width: 200, height: 100)
    tileStoneTop12.anchorPoint = CGPointZero
    tileStoneTop12.position = CGPoint(x: 1100, y: 5780)
    tileStoneTop12.zPosition = 2
    addChild(tileStoneTop12)

    tileStoneTop13.size = CGSize(width: 100, height: 100)
    tileStoneTop13.anchorPoint = CGPointZero
    tileStoneTop13.position = CGPoint(x: 1100, y: 5780)
    tileStoneTop13.zPosition = 2
   // addChild(tileStoneTop13)

}    

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch in touches {            
        let touchLocation = touch.locationInNode(self)
        let touchedNode = nodeAtPoint(touchLocation)

        if touchedNode.name == "box" {
            isTouched = true                                
        }

        if touchedNode.name == "rerun"{

            for node in self.nodesAtPoint(touchLocation) {
                if node.name == "rerun" {
                    isTouched = false
                    node.removeFromParent()
                }
            }
        }
    }                          
}

let moveFactor:CGFloat = 0.5

override func update(currentTime: CFTimeInterval) {

    var tileStoneArray = [tileStone1, tileStone2, tileStone3, tileStone4, tileStone5, tileStone6, tileStone7, tileStone8, tileStone9, tileStone10, tileStone11, tileStone12, tileStone13, tileStone14, tileStone15, tileStone16, tileStone17, tileStone18, tileStone19, tileStone20, tileStone21, tileStone22, tileStoneTop1, tileStoneTop2, tileStoneTop3, tileStoneTop4, tileStoneTop5, tileStoneTop6, tileStoneTop7, tileStoneTop8, tileStoneTop9, tileStoneTop10, tileStoneTop11, tileStoneTop12, tileStoneTop13]

    if isTouched == false {
        enemyBox.position = CGPoint(x:  enemyBox.position.x - 10, y: 215)
    }

    if enemyBox.position.x < self.frame.minX - 100 {                      
        enemyBox.position = CGPoint(x: self.frame.maxX, y: 215)
    }        

        for tileStone1 in tileStoneArray {

            if isTouched == false {

            tileStone1.position = CGPoint(x: tileStone1.position.x - 10, y: tileStone1.position.y)

            }


            if (tileStone1.position.x < self.frame.minX - 100){

                tileStone1.anchorPoint = CGPointZero

                tileStone1.position = CGPoint(x: self.frame.maxX, y: tileStone1.position.y)
            }
        }
    var score = 0;

    func addGreatNode(){

        let congratsLabel = SKLabelNode(fontNamed: "")
        congratsLabel.name = "rerun"
        congratsLabel.text = "Great!"
        congratsLabel.fontSize = 65
        congratsLabel.position = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height / 2)
        congratsLabel.fontColor = SKColor.yellowColor()
        addChild(congratsLabel)
    }               

        if isTouched == true {                
            var xValuesEnemy = enemyBox.position.x
            var xValuesPlayer = player.position.x

            if xValuesPlayer < xValuesEnemy + 120 && xValuesPlayer > xValuesEnemy - 120 {           
               addGreatNode()
               //This is where it adds the node infinitely
            }
            else {

            }            
        }        
    }    
}

This is a image of my node count climbing while in my game.

我知道我可以提高我的代码效率,但我很缺乏经验,但我正在研究它。

1 个答案:

答案 0 :(得分:3)

您的addGreatNode()函数正在update:内被调用,该场景被场景调用,每秒最多60次。

还有一些提示:

  • 将您的TileStones保存在集合中

  • 将TileStones添加到场景时,请使用forwhile循环。这将压缩您的代码。在每次迭代中,调整每个节点的位置。

  • 如果您想在触摸时添加SKLabelNode,则该逻辑应位于touchesBegan:内,且与update:
  • 无关