SpriteKit节点未从父节点中删除

时间:2016-01-22 06:42:40

标签: ios sprite-kit

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

我的项目目前分为两个部分,一个是构建SpriteKit项目时默认的GameScene类,另一个是我在游戏中的每个圆圈上操作的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()

    }

}

在我在另一个swift文件中创建的Circles类中调用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

        }

    }

}

我真正得到的是我不知道为什么圈子有时会被卡住或者没有从屏幕上移除。

非常感谢任何帮助!

整个游戏代码如下:

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

    }

}

1 个答案:

答案 0 :(得分:1)

问题在于此片段:

        var posn = circlesInPlay.count - 1

    for c in circlesInPlay {

        if (c.size < 0) {

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

        }

    }

您始终从集合中删除最后一个元素,而不是在迭代中使用的元素。在迭代时更改集合时也要小心。如果从集合中删除元素,索引将更改。