【问题标题】:Stop an action until all gameobjects have stopped colliding with barrier停止一个动作,直到所有游戏对象都停止与障碍物碰撞
【发布时间】:2016-01-13 04:04:53
【问题描述】:

到目前为止,在我的代码中,有一个碰撞检测方法可以检测某个精灵是否撞到了障碍物,还有一个我已经实现的动作序列。在动作序列中,我希望有一个等待期,在此期间动作停止,直到一定数量的精灵落地(屏障)。到目前为止,我已经得到了旋转和立方体下降以及主要立方体精灵,但我试图解决的问题是让立方体停止旋转,直到所有立方体都撞到障碍物。基本上停止一个动作,直到一定数量的射弹物体与某物发生碰撞,然后继续该动作。此外,立方体的生成也是动作序列的一部分,因此请了解如何在我的代码中不造成混乱。

请参考以下代码。

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")
    }
}

【问题讨论】:

    标签: sprite-kit swift2


    【解决方案1】:

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

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

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

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

    这将使多维数据集的所有行为保持在其自己的类中(最好在单独的文件中),并避免您的 SKView 成为无法管理的大块代码。

    【讨论】:

      猜你喜欢
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多