停止操作,直到所有游戏对象都停止与障碍物碰撞

时间:2016-01-13 04:04:53

标签: sprite-kit swift2

到目前为止,在我的代码中有一个碰撞检测方法,当某个精灵遇到障碍时会发现,并且还有一个我已经实现的动作序列。在动作序列中,我希望有一个等待时间,动作停止,直到一定数量的精灵击中地面(障碍物)。到目前为止,我已经得到了旋转和立方体掉落以及主立方体精灵,但我想要解决的问题是让立方体停止旋转,直到所有立方体都撞到了障碍物。基本上停止动作直到一定数量的射弹物体与某物碰撞,然后继续动作。此外,多维数据集的产生是动作序列的一部分,所以idk做什么而不在我的代码中创建混乱。

请参阅以下代码以供参考。

class GameScene:SKScene {
    var wait:NSTimeInterval = 0
    var blocks = 0
    var cube = SKSpriteNode(imageNamed: "cube")
    func didBeginContact(contact: SKPhysicsContact) {
    var firstBody = SKPhysicsBody()
    var secondBody = SKPhysicsBody()

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else{
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }
    if firstBody.categoryBitMask == barrierCategory && secondBody.categoryBitMask == objectCategory {
        secondBody.node?.removeFromParent()
        counterTest++
        print("hello")
    }
    if (firstBody.categoryBitMask == blockCategory && secondBody.categoryBitMask == barrierCategory) {
         blocks++
    }

}
    override func didMoveToView(view: SKView) {
        NSLog("Start") //Using NSLog just to print the current time
        NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(interval!), target: self, selector: Selector("spawnBlocks"), userInfo: nil, repeats: false)
        cube.runAction(recursive())
    }

  }
    func recursive(){
        let recursive = SKAction.sequence([


            //SHOULD SPAWN ABOUT 10 BLOCKS
            SKAction.spawnBlocks,

            //WAIT UNTIL THE COLLISION HAS DETECTED 10 BLOCKS HIT THE BARRIER
            SKAction.waitForDuration(waitTime),

            //CONTINUE THE ROTATION OF THE CUBE SPRITE
            SKAction.rotate,

            SKAction.runBlock({[unowned self] in NSLog("Block executed"); self.recursive()})
            ])
        runAction(recursive, withKey: "aKey")
    }
}

1 个答案:

答案 0 :(得分:1)

你不需要你的行动是递归的。这使得逻辑难以流动而且是不必要的。

如果您的多维数据集具有连续且自治的行为,它应该在SKSprite的子类中自行管理它。

我建议你创建一个旋转动作并运行它&#34;永远&#34;在你的立方体上。如果希望它停止,请使用removeActionWithName。如果希望恢复旋转,请再次添加。这将使您能够实现易于使用的&#34; startRotating&#34; /&#34; stopRotating&#34;您可以在适当的时候调用的一对函数。

与多维数据集的连续行为相同,将其置于永久重复的runBlock操作中,并在满足条件时启动/停止其他操作。

这将使所有多维数据集的行为保持在自己的类中(最好是在一个单独的文件中),并避免让SKView成为一个难以管理的大代码。