首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spritekit游戏崩溃(因为SKLightNode线程问题?)

Spritekit游戏崩溃(因为SKLightNode线程问题?)
EN

Stack Overflow用户
提问于 2016-04-21 14:32:22
回答 1查看 142关注 0票数 1

我正试图为我的孩子们创造一个简单的游戏。我正在尝试实现光和发射节点。然而,游戏在碰撞时崩溃,这应该会导致gameOverScene。奇怪的是,如果我添加一个刹车点,代码就会完成ok。下面是代码:

代码语言:javascript
复制
   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            touch = touches.first!
            turnOnLightNode(touch.locationInNode(self))   
        }

        override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
            touch = touches.first!
            turnOnLightNode(touch.locationInNode(self))
    }
        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
            removeLightNode()
        }
        func removeLightNode(){
            var nodeToRemove = self.childNodeWithName("light")
            while(nodeToRemove != nil && endOfSceneCollision == false) {
                nodeToRemove?.removeFromParent()
                nodeToRemove = self.childNodeWithName("light")
            }
            nodeToRemove = self.childNodeWithName("touchEmitterNode")
            while(nodeToRemove != nil && endOfSceneCollision == false) {
                nodeToRemove?.removeFromParent()
                nodeToRemove = self.childNodeWithName("touchEmitterNode")
            }
        }
        override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
            removeLightNode()
        }
        func turnOnLightNode(point: CGPoint){

            removeLightNode()

            light.name = "light"
            light.categoryBitMask = 3
            light.position = point
            light.zPosition = 19.0
            light.falloff = 0.5
            light.enabled = true
            light.lightColor = UIColor(red:  161/255, green: 218/255, blue: 237/255, alpha: 0.5)
            light.shadowColor = UIColor(red:  161/255, green: 218/255, blue: 237/255, alpha: 0.5)
            light.ambientColor = UIColor(red:  220/255, green: 220/255, blue: 220/255, alpha: 0.3)

            addChild(light)

            touchEmitter!.name = "touchEmitterNode"
            touchEmitter!.position = point
            touchEmitter!.zPosition = 100//gameFieldParticlesZPosition
            addChild(touchEmitter!)   
        }

func didBeginContact(contact: SKPhysicsContact) {        
        var ballBody: SKPhysicsBody?
        var lineBody: SKPhysicsBody?
        var collidedBallNode: SKSpriteNode?

        if contact.bodyA.categoryBitMask == 2 && contact.bodyB.categoryBitMask == 1 {
            print("didBeginContactAB")

            lineBody = contact.bodyA
            ballBody = contact.bodyB
            collidedBallNode = contact.bodyB.node as? SKSpriteNode
        }
        if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 2 {
            print("didBeginContactBA")

            lineBody = contact.bodyB
            ballBody = contact.bodyA
            collidedBallNode = contact.bodyA.node as? SKSpriteNode
        }
        if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 4 {
            //audioController.playSound(electricBounceSound, volume: 1.0)
        }
        if contact.bodyA.categoryBitMask == 4 && contact.bodyB.categoryBitMask == 1 {
            //audioController.playSound(electricBounceSound, volume: 1.0)
        }
        if contact.bodyA.categoryBitMask == 1 && contact.bodyB.categoryBitMask == 1 {
            //audioController.playSound(electricNoiseSound, volume: 1.0)
        }

        if(collidedBallNode != nil){
            gotoGameOverScene(collidedBallNode!)

        }
    }
func gotoGameOverScene(explodingBallNode: SKSpriteNode){
        print("step 1") //IF BREAKPOINT HERE, ALL EXECUTES OK           
        self.runAction(SKAction.waitForDuration(2.5), completion: {
            print("step 2")
            let gameOverScene = GameOverScene(size: self.size) 
            print("step 3")
            self.view?.presentScene(gameOverScene, transition: reveal)
            print("step 4")
        })
    }

其结果是:

代码语言:javascript
复制
    didBeginContactAB
    step 1
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attemped to add a SKNode which already has a parent: <SKLightNode> name:'light' position:{296.99994, 191.49995} scale:{1.00, 1.00} accumulatedFrame:{{297, 191.5}, {0, 0}}'
    *** First throw call stack:
    (
        0   CoreFoundation                      0x01384a14 __exceptionPreprocess + 180
        1   libobjc.A.dylib                     0x00b5de02 objc_exception_throw + 50
        2   CoreFoundation                      0x0138493d +[NSException raise:format:] + 141

但是,如果我将调试器断点放在以下行之前:

代码语言:javascript
复制
print("step 1")

代码成功地执行。必须是线程/同步问题,但这超出了Spritekit / Swift的诀窍。有人能帮我修一下这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 03:51:51

啊.我知道了。removeLightNode函数中愚蠢的代码。这导致碰撞后删除无法工作:while(nodeToRemove != nil && endOfSceneCollision == false)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36772742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档