如何使用SpriteKit的SKAction为SKSpriteNode创建时间间隔?

时间:2016-03-21 20:15:03

标签: ios swift sprite-kit

我有一个功能,篮球。我希望能够在常规时间间隔内在CGPoint(515,700)(屏幕顶部)生成我的basketBall节点。我知道的唯一可以完成等待几秒钟的方法就是sleep();但是,sleep()显然不允许SpriteNodes保留在屏幕上,所以我需要一个替代方案。

我发现了NSTimeInterval,但我更愿意避免导入Foundation。我认为SKAction允许时间通过waitForDuration(),但我很困惑它是如何工作的。有人能否对SpriteKit的SKAction有所了解?

override func didMoveToView(view: SKView) {

    let basketBall = SKSpriteNode(imageNamed: "basketball")
    let waitForObjects = SKAction.waitForDuration(3)
    let basketBallFalls = SKAction.runBlock({
        self.Basketball()
    })
    let action = SKAction.sequence([waitForObjects, basketBallFalls])


    SKAction.runAction(action, onChildWithName: "basketball")
    SKAction.repeatActionForever(action)
    //Basketball()
}

func Basketball(){

    basketBall.position = CGPointMake(515, 700)
    basketBall.size = CGSizeMake(50, 50)
    basketBall.size = CGSize(width: 50.0, height: 50.0)
    basketBall.zPosition = 10
    basketBall.physicsBody = SKPhysicsBody(circleOfRadius: 25.0)
    basketBall.physicsBody?.mass = 0.8
    basketBall.physicsBody?.restitution = 0.6
    basketBall.physicsBody?.dynamic = true


    self.addChild(basketBall)
}

2 个答案:

答案 0 :(得分:4)

尝试使用SKAction.waitForDuration(_:)

实施例。像这样的东西:

let waitDuration = NSTimeInterval(arc4random_uniform(20))

let waitAction = SKAction.waitForDuration(waitDuration)
let ballAction = SKAction.runBlock(self.Basketball) //call your function

runAction(SKAction.sequence([waitAction, ballAction]))

答案 1 :(得分:2)

有两种直接的方法可以定期生成新节点。它们都涉及你的场景。

每帧调用场景的update(_:)方法,参数是当前时间。向场景类添加NSTimeInterval属性,该属性将存储您上次创建篮球的时间。在update(_:)中,从上一个生成时间中减去当前时间。如果差异大于您想要的间隔,则生成一个新节点并保留新的当前时间。

您的场景也可以像任何其他节点一样运行操作。 SKAction有一个waitForDuration(_:)方法,可以创建一个与其名称完全相同的操作。您可以使用将执行产卵的SKAction.runBlock(_:)创建另一个操作。然后创建a sequence action运行延迟操作,然后执行spawn操作。将其包裹在repeatActionForever(_:)中,最后告诉您的场景运行转发器操作。