2016-08-09 3 views
0

私のプロジェクトでは、ゲームで特定のイベントが発生したときに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.

私は私のコードをより効率的に改善できることを知っていますが、私は非常に未熟ですが、私はそれに取り組んでいます。

+0

に関連付けられてはならない、あなたの文はまだあなたが 'addGreatNodeを呼び出した後、該当する場合() 'を呼び出すので、関数はすべての更新時に再び呼び出されます。 –

+0

お読みください(http://stackoverflow.com/help/someone-answers)、誰かがあなたの質問に答えたときに何をすべきかを説明してください。 –

+0

Ugh man :)このようなプロパテイの束を持つ代わりに配列を使用してください。この場合、本当に必要はありません。 – Whirlwind

答えて

3

あなたのaddGreatNode()機能は、1秒間に60回までシーンによって呼び出されるupdate:内で呼び出されています。

さらにいくつかのヒント:あなたのシーンにTileStonesを追加する場合

  • いずれかforまたはwhileループを使用し、

  • コレクションであなたのTileStonesをしてください。これにより、コードがコンパクトになります。各反復で、各ノードの位置を調整します。あなたはSKLabelNode touch上で追加したい場合は

  • は、そのロジックはtouchesBegan:内にあり、update:それは中の条件のように見える
関連する問題