到目前为止,在我的代码中有一个碰撞检测方法,当某个精灵遇到障碍时会发现,并且还有一个我已经实现的动作序列。在动作序列中,我希望有一个等待时间,动作停止,直到一定数量的精灵击中地面(障碍物)。到目前为止,我已经得到了旋转和立方体掉落以及主立方体精灵,但我想要解决的问题是让立方体停止旋转,直到所有立方体都撞到了障碍物。基本上停止动作直到一定数量的射弹物体与某物碰撞,然后继续动作。此外,多维数据集的产生是动作序列的一部分,所以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")
}
}
答案 0 :(得分:1)
你不需要你的行动是递归的。这使得逻辑难以流动而且是不必要的。
如果您的多维数据集具有连续且自治的行为,它应该在SKSprite的子类中自行管理它。
我建议你创建一个旋转动作并运行它&#34;永远&#34;在你的立方体上。如果希望它停止,请使用removeActionWithName。如果希望恢复旋转,请再次添加。这将使您能够实现易于使用的&#34; startRotating&#34; /&#34; stopRotating&#34;您可以在适当的时候调用的一对函数。
与多维数据集的连续行为相同,将其置于永久重复的runBlock操作中,并在满足条件时启动/停止其他操作。
这将使所有多维数据集的行为保持在自己的类中(最好是在一个单独的文件中),并避免让SKView成为一个难以管理的大代码。