Increasing/Decreasing等待持续时间()?
Increasing/Decreasing waitForDuration( )?
我想知道是否可以使用变量增加 withForDuration( )。简而言之,这就是我试图做到的。这也是 SpriteKit,这是我第一次使用它,所以我还是有点不确定。虽然这段代码可以改变浮点数,但它实际上并没有改变 waitForDuration(difficulty)
var timer: NSTimer!
var difficulty = 1.0
override func didMoveToView(view: SKView) {
backgroundColor = SKColor.whiteColor()
player.position = CGPoint(x: size.width * 0.5, y: size.height * 0.25)
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
addChild(player)
physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "increaseDifficulty", userInfo: nil, repeats: true)
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addEnemy),
SKAction.waitForDuration(difficulty)
])
))
}
func increaseDifficulty() {
difficulty -= 0.1
}
你没有得到预期的效果,因为 'difficulty' 的值在你的 SKAction 的第一个声明中被捕获并且它再也没有引用外部声明。
两种解决方法:
而不是 SKAction.repeatActionForever()
,转储 SKAction.sequence()
in increaseDifficulty。您必须稍微调整一下数字才能使其正常工作,但 NSTimer 已经 运行 重复,您可以改用它。
第二种方法(不是100%确定)是在难度前面加上'&'符号。这通过引用而不是通过值来传递难度,这应该会给你预期的效果。我只是不确定 Swift 是否允许这样做,但在 C++ 中这是我们可以做的。
一种方法是使用 runAction function
的 completionHandler
。例如。
func addEnemyWithChangingDifficulty() {
let waitAction = SKAction.waitForDuration(difficulty)
let addEnemyAction = SKAction.runBlock { () -> Void in
self.addEnemy()
}
runAction(SKAction.sequence([addEnemyAction,waitAction]), completion: { () -> Void in
self.addEnemyWithChangingDifficulty()
})
}
另一种方法是使用 update function
来跟踪 waitDuration
。
var lastAddedTime : CFTimeInterval = 0
override func update(currentTime: CFTimeInterval) {
if currentTime - lastAddedTime > CFTimeInterval(difficulty) {
addEnemy()
lastAddedTime = currentTime
}
}
我想知道是否可以使用变量增加 withForDuration( )。简而言之,这就是我试图做到的。这也是 SpriteKit,这是我第一次使用它,所以我还是有点不确定。虽然这段代码可以改变浮点数,但它实际上并没有改变 waitForDuration(difficulty)
var timer: NSTimer!
var difficulty = 1.0
override func didMoveToView(view: SKView) {
backgroundColor = SKColor.whiteColor()
player.position = CGPoint(x: size.width * 0.5, y: size.height * 0.25)
player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width/2)
player.physicsBody?.dynamic = true
addChild(player)
physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "increaseDifficulty", userInfo: nil, repeats: true)
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addEnemy),
SKAction.waitForDuration(difficulty)
])
))
}
func increaseDifficulty() {
difficulty -= 0.1
}
你没有得到预期的效果,因为 'difficulty' 的值在你的 SKAction 的第一个声明中被捕获并且它再也没有引用外部声明。
两种解决方法:
而不是 SKAction.repeatActionForever()
,转储 SKAction.sequence()
in increaseDifficulty。您必须稍微调整一下数字才能使其正常工作,但 NSTimer 已经 运行 重复,您可以改用它。
第二种方法(不是100%确定)是在难度前面加上'&'符号。这通过引用而不是通过值来传递难度,这应该会给你预期的效果。我只是不确定 Swift 是否允许这样做,但在 C++ 中这是我们可以做的。
一种方法是使用 runAction function
的 completionHandler
。例如。
func addEnemyWithChangingDifficulty() {
let waitAction = SKAction.waitForDuration(difficulty)
let addEnemyAction = SKAction.runBlock { () -> Void in
self.addEnemy()
}
runAction(SKAction.sequence([addEnemyAction,waitAction]), completion: { () -> Void in
self.addEnemyWithChangingDifficulty()
})
}
另一种方法是使用 update function
来跟踪 waitDuration
。
var lastAddedTime : CFTimeInterval = 0
override func update(currentTime: CFTimeInterval) {
if currentTime - lastAddedTime > CFTimeInterval(difficulty) {
addEnemy()
lastAddedTime = currentTime
}
}