在我的SpriteKit项目中,我有一个spawnEnemy
方法。我想要一遍又一遍地调用这个方法,以便敌人在整个游戏中继续产生。
我为实现这一目标所做的是将spawnEnemy
方法放在SKAction runBlock
中并让我的SKScene
永远运行该操作,并在两次调用之间延迟(以防止应用程序过载) )。
以下是相关代码的摘要:
var _spawnSpeedSeconds: Double = 2.0
func startSpawning()
{
let waitForXSeconds = SKAction.waitForDuration(self._spawnSpeedSeconds)
let spawn = SKAction.runBlock({ () -> Void in
self.spawnEnemy()
})
self.runAction(SKAction.repeatActionForever(SKAction.sequence([spawn, waitForXSeconds])), withKey: "spawnEnemy")
}
func spawnEnemy()
{
...
}
现在经过一段时间后(例如当玩家获得5分或者其他东西时),我减少_spawnSpeedSeconds以使敌人在更短的时间内产生更多的东西来增加难度。
问题是,即使我减少_spawnSpeedSeconds变量,SKScene运行的spawn动作的延迟仍然是相同的。
我能想到解决此问题的唯一方法是删除操作,然后使用新的延迟/生成率重新添加操作。有没有更好的方法来解决这个问题?
由于
答案 0 :(得分:3)
在这种情况下不要使用动作。他们并没有真正以动态的方式工作。一旦你设置它们,它们就会卡住。只需使用您的更新方法。
我会告诉你我是如何定期发射导弹的:
首先在班上设置两个计时器
var missleTimer:NSTimeInterval = NSTimeInterval(2)
var missleInterval:NSTimeInterval = NSTimeInterval(2)
现在在我们的更新方法中,我们会减少时间并产生导弹
// subtract time from our timer
self.missleTimer -= self.delta
// when our timer reaches zero
if self.missleTimer <= 0 {
// run your spawning code
self.launchMissle()
// reset timer
self.missleTimer = self.missleInterval
}
这比在这种情况下使用操作更好,因为我可以在代码中的任何位置设置missleInterval
,并且始终会反映更改。
答案 1 :(得分:1)
-(void)recursiveMethod
{
if(shouldSpawnEnemy)
{
_spawnSpeedSeconds -= 0.01;
SKAction *wait = [SKAction waitForDuration: 0.5];
SKAction *action = [SKAction performSelector:@selector(recursiveMethod) onTarget:self];
SKAction *sequence = [SKAction sequence:@[wait,action]];
[self repeatActionForever:sequence];
}
}
当你想要开始产生敌人时,请记得调用recursiveMethod。 希望有所帮助。