2016-01-22 73 views
1

我有一个问题,为什么我的SpriteKit节点没有从下面的代码中从我的父节点中删除。SpriteKit节点没有被从父节点删除

我的项目目前有两个部分,一个是GameScene类,它在您创建SpriteKit项目时出现默认值,另一个是我在游戏中的每个圆上操作的Circles类。

的圆圈被存储在数组中的位置:

var circlesInPlay = [Circles]() 

基本上,我试图设计一简单的游戏,圆圈尺寸减小,并且当它们是0宽度的,从屏幕除去。

我的代码要做到这一点就在这里,在

override func update(currentTime: CFTimeInterval) { 


    timeSinceUpdate = timeSinceUpdate + 1 
    print("time since update: " + String(timeSinceUpdate)) 

    if timeForUpdate == timeSinceUpdate { 
     newCircle() 
     timeSinceUpdate = 0 
     //timeForUpdate = Int(arc4random_uniform(100) + 1) 
     timeForUpdate = 100 
    } 

    //Check to see if circle transparancies are 0 

    if checkGameOver() { 

     gameOver() 
    } 

    updateCircles() 
    removeCircles() 

的timeSinceUpdate变量是自上次圈已经被放置到屏幕上,它通过一个每帧更新增加了时间。

updateCircles()调用此,

func updateCircles() { 

    for c in circlesInPlay { 

     c.update() 

    } 

} 

其中要求在圆类我在另一个迅速文件进行更新():

func update() { 

    transparancy = transparancy - transparancyDecrease 
    size = size - ds 

    if (size <= 0) { 
     node.removeFromParent() 
    } 

    node.size.height = size 
    node.size.width = size 

} 

从更新功能的其他调用removeCircles( )在这里

func removeCircles() { 

    var posn = circlesInPlay.count - 1 

    for c in circlesInPlay { 

     if (c.size < 0) { 

      c.produceNode().removeFromParent() 
      circlesInPlay.removeAtIndex(posn) 
      posn = posn - 1 

     } 

    } 

} 

我真的得到的是我不知道为什么圈子是索姆etimes卡住或没有被从屏幕上移除。

任何帮助,非常感谢!

整个游戏代码如下:

import SpriteKit 

class GameScene: SKScene { 

    var bgImage = SKSpriteNode(imageNamed: "background.png") 

    let screenSize = UIScreen.mainScreen().bounds 

    var timeSinceUpdate: Int = 0 

    var circlesInPlay = [Circles]() 

    var timeForUpdate = Int(arc4random_uniform(200) + 1) 

    override func didMoveToView(view: SKView) { 

     bgImage.position = CGPointMake(self.size.width/2, self.size.height/2) 
     bgImage.zPosition = -100 
     self.addChild(bgImage) 






    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 

     for touch in touches { 
      let location = touch.locationInNode(self) 

      if !isTouchInCircle(location) { 

       gameOver() 
      } 


     } 
    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 

     timeSinceUpdate = timeSinceUpdate + 1 
     print("time since update: " + String(timeSinceUpdate)) 

     if timeForUpdate == timeSinceUpdate { 
      newCircle() 
      timeSinceUpdate = 0 
      //timeForUpdate = Int(arc4random_uniform(100) + 1) 
      timeForUpdate = 100 
     } 

     //Check to see if circle transparancies are 0 

     if checkGameOver() { 

      gameOver() 
     } 

     updateCircles() 
     removeCircles() 

    } 

    func newCircle(){ 

     let sizeX = UInt32(CGRectGetMaxX(self.frame)) 
     let randomx = CGFloat(arc4random_uniform(sizeX)) 

     let sizeY = UInt32(CGRectGetMaxY(self.frame)) 
     let randomy = CGFloat(arc4random_uniform(sizeY)) 

     //let randomx = CGFloat(arc4random_uniform(UInt32(self.size.width))) 
     //let randomy = CGFloat(arc4random_uniform(UInt32(self.size.height))) 

     if (circlesInPlay.count < 5) { 

      circlesInPlay.append(Circles.init(x: randomx, y: randomy)) 
      self.addChild((circlesInPlay[circlesInPlay.count - 1]).produceNode()) 
     } 

    } 

    func checkGameOver() -> Bool { 


     for c in circlesInPlay { 

      if c.getTransparancy() == 0 { 

       return false 

      } 

     } 

     return true 
    } 

    func isTouchInCircle(touch: CGPoint) -> Bool { 

     for c in circlesInPlay { 

      if (c.getX() <= (touch.x * 1.10)) { 

       return true 
      } 

     } 

     return false 

    } 


    func updateCircles() { 

     for c in circlesInPlay { 

      c.update() 

     } 

    } 

    func removeCircles() { 

     var posn = circlesInPlay.count - 1 

     for c in circlesInPlay { 

      if (c.size < 0) { 

       c.produceNode().removeFromParent() 
       circlesInPlay.removeAtIndex(posn) 
       posn = posn - 1 

      } 

     } 

    } 


    func gameOver() { 


    } 

} 



import Foundation 
import SpriteKit 
import GameKit 


class Circles { 


    var node = SKSpriteNode() 

    var size: CGFloat = 200 
    var ds: CGFloat = 2 

    var colorC: String; 


    var xpos: CGFloat 
    var ypos: CGFloat 

    var transparancy: Int 
    var transparancyDecrease: Int = 1 



    let arrayColors = ["circleRed.png", "circleBlue.png", "circlePink.png", "circleGreen.png", "circleYellow.png"] 


    //The innitial constructor 
    init(x: CGFloat, y: CGFloat) { 

     self.xpos = x 
     self.ypos = y 

     self.transparancy = 100 

     let randomIndex = Int(arc4random_uniform(UInt32(arrayColors.count))) 

     colorC = arrayColors[randomIndex] 

     node.texture = SKTexture(imageNamed: colorC) 
     node.position = CGPointMake(self.xpos, self.ypos) 
     node.size.height = self.size 
     node.size.width = self.size 

    } 

    func produceNode() -> SKSpriteNode { 

     return node 

    } 


    func setColor() { 

     let randomIndex = Int(arc4random_uniform(UInt32(arrayColors.count))) 

     colorC = arrayColors[randomIndex] 



    } 


    func update() { 

     transparancy = transparancy - transparancyDecrease 
     size = size - ds 

     if (size <= 0) { 
      node.removeFromParent() 
     } 

     node.size.height = size 
     node.size.width = size 

    } 

    func getX() -> CGFloat { 

     return xpos 
    } 

    func getY() -> CGFloat { 

     return ypos 
    } 


    /* 
    func getColor() -> SKColor { 

     return colorC 

    }*/ 

    func getTransparancy() -> Int { 

     return transparancy 

    } 

} 
+0

如果c.size <= 0 {...}而不是c.size <0,则在removeCircles()方法中。 – Whirlwind

回答

1

的问题是,在这个片段:

 var posn = circlesInPlay.count - 1 

    for c in circlesInPlay { 

     if (c.size < 0) { 

      c.produceNode().removeFromParent() 
      circlesInPlay.removeAtIndex(posn) 
      posn = posn - 1 

     } 

    } 

你总是从你收集,而不是你是元素去掉最后一个元素在迭代中使用。在迭代thrue时更改集合时也要小心。如果从集合中删除元素,索引将会更改。