我有一个SKScene
,其中我有一个定时器回调(不是运行循环),它在每个时间步骤通过添加和/或删除SKNode来更新场景。这个想法是动画沿直线向下行进的节点。以下是我的回调中的代码。
// 1. Add new nodes
let newSprite = SKSpriteNode(imageNamed: "file")
newSprite.position = (pos, pos)
spriteList.append((sprite: newSprite, position: 0))
scene.addChild(newSprite)
var removeList = [Int]()
let action = SKAction.move(to: (new, pos), duration: 5.0)
newSprite.run(action)
// 2. Update node positions
for (i,_) in spriteList.enumerated() {
spriteList[i].position += 1
if spriteList[i].position > gridLength {
removeList.append(i)
}
}
// 3. Remove old nodes
for i in removeList {
spriteList[i].sprite.removeFromParent()
spriteList.remove(at: i)
}
目前,每次回调运行时,动画都会断断续续。当回调停止并且我没有更多节点要添加时,场景中的其余节点将平滑地向下动画。有什么建议我可以解决这个问题吗?是添加节点,运行逻辑还是其他东西的问题?
答案 0 :(得分:1)
我有一个SKScene,我有一个定时器回调(不是运行循环)
你永远不应该使用SpriteKit的计时器,而是始终坚持运行循环。
如果您想每n
秒重复一段代码,只需使用操作
class Scene: SKScene {
override func didMove(to view: SKView) {
super.didMove(to: view)
let action = SKAction.run { [unowned self] in
// <--- put the codwe you want to repeat every 2 seconds here
}
let wait = SKAction.wait(forDuration: 2)
let sequence = SKAction.sequence([action, wait])
let repeatForever = SKAction.repeatForever(sequence)
run(repeatForever)
}
}