我想在生成节点之间等待2秒钟。所以我写了这段代码:
override func update(currentTime: CFTimeInterval) {
let releaseNodes = SKAction.sequence([SKAction.runBlock(self.generateNode), SKAction.waitForDuration(2)])
self.runAction(releaseNodes)
}
但它不起作用。它正在疯狂地生成节点。 (像20秒)。我怎么处理它?有人可以帮帮我吗?
编辑:这是self.generateNode块
func generateNode(){
var node: SKSpriteNode = SKSpriteNode(imageNamed: "node")
fish.anchorPoint = CGPoint(x:CGFloat(-0.5),y:CGFloat(-0.2))
fish.position = CGPoint(x:CGFloat(10),y:CGFloat(30))
var move = SKAction.rotateToAngle(CGFloat(3.14), duration: NSTimeInterval(1))
var remove = SKAction.removeFromParent()
var seq = SKAction.sequence([move, remove])
node.runAction(seq)
self.addChild(node)
}
答案 0 :(得分:1)
关于函数SKScene.Update()
的Apple文档 Performs any scene-specific updates that need to occur before scene actions are evaluated.
因此,如果在update()中你不加区分地运行动作,它将无限循环地创建节点并尝试运行动作。
您应该选择一个更好的地方来制作场景内容。也许在viewDidLayoutSubviews()之后?或者,至少是为了回应你场景中的某些动作。
编辑: 看起来你想创建内容,让它移动然后从场景中删除它。你可能最好只创建一些精灵,保存对它们的引用然后让它们出现,移动并在需要时消失。那会更安全。
答案 1 :(得分:1)
我最好摆脱使用update:
方法并使用SKAction
s做一切:
- (void)didMoveToView:(SKView *)skView {
SKAction *wait = [SKAction waitForDuration:2.];
SKAction *generateNode = [SKAction runBlock:^{
[self generateNode];
}];
[self runAction:[SKAction repeatActionForever:
[SKAction sequence:@[wait, generateNode]]]];
}
答案 2 :(得分:0)
override func update(currentTime: CFTimeInterval) {
static var previousTime = 0.0
if (currentTime - previousTime) > 2.0 {
let releaseNodes = SKAction.runBlock(self.generateNode)
self.runAction(releaseNodes)
}
previousTime = currentTime
}
update(currentTime:)
为您提供当前帧的时间戳。不要忘记使用该财产。
此外,上一次waitForDuration:
操作不会对原始代码产生明显影响。