2016-08-09 50 views
0

In meinem Projekt läuft alles reibungslos und funktioniert gut außer, wenn ich 1 Instanz eines SKLabelNode hinzufügen möchte, wenn ein bestimmtes Ereignis in meinem Spiel passiert.
Dann ist Problem, wenn das Ereignis passiert es, das SKLabelNode mehr als einmal hinzufügt und es hält auf es in die Tausende tun ...Sprite Kit Wird nicht aufhören, Knoten hinzuzufügen

Hier ist mein Code:

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.

I Ich weiß, dass ich meinen Code verbessern kann, um effizienter zu sein, aber ich bin sehr unerfahren, aber ich arbeite daran.

+0

Es ist wie die Bedingungen sieht in Ihrem if-Anweisung ist immer noch wahr, nachdem Sie rufen 'addGreatNode() ', damit die Funktion bei jedem Update erneut aufgerufen wird. –

+0

Bitte [lesen] (http://stackoverflow.com/help/someone-answers), es beschreibt, was Sie tun sollten, wenn jemand Ihre Frage beantwortet. –

+0

Ugh Mann :) Verwenden Sie Arrays anstelle von Haufen von Eigenschaften wie folgt. Wirklich keine Notwendigkeit dafür in diesem Fall. – Whirlwind

Antwort

3

Ihre addGreatNode() Funktion wird innerhalb update: aufgerufen, die von der Szene bis zu 60 Mal pro Sekunde aufgerufen wird.

Noch ein paar Tipps:

  • Halten Sie Ihre TileStones in einer Sammlung

  • Wenn TileStones zu Ihrer Szene hinzufügen, verwenden entweder eine for oder while Schleife. Dies wird deinen Code komprimieren. Passen Sie in jeder Iteration die Position für jeden Knoten an.

  • Wenn Sie ein SKLabelNode auf Note hinzufügen mögen, dass die Logik innerhalb touchesBegan: sein sollte, und nicht im Zusammenhang mit update: