如何同步SKAction?SpriteKit双节点动作同步实现问询
实现SKSpriteNode闸门动作同步执行的方案
问题场景
我拥有两个闸门节点:
var leftGate = SKSpriteNode() var rightGate = SKSpriteNode()
同时为这些节点编写了动作代码:
var wait = SKAction.wait(forDuration: 2, withRange: 5) var moveLeftGate = SKAction.rotate(toAngle: 25, duration: 1) var moveLeftGateBack = SKAction.rotate(toAngle: 0, duration: 1) var sequenceForTheLeftGate = SKAction.sequence([moveLeftGate, moveLeftGateBack])
右侧节点也有相同逻辑的动作代码,最终执行代码如下:
leftGate.run(sequenceForTheLeftGate) rightGate.run(sequenceForTheRightGate)
当前代码可正常运行,随机等待功能也正常,但两个闸门节点的动作相互独立。我希望实现两个节点动作同步执行,请问该如何操作?
解决方案
方法一:共享统一的动作实例
通过创建同一套动作实例(包括统一的随机等待时长),让两个闸门同时执行这套动作,确保动作时序完全同步:
// 先生成统一的随机等待时长,避免两个节点等待时间不一致 let randomWaitDuration = 2 + Double.random(in: 0...5) let wait = SKAction.wait(forDuration: randomWaitDuration) // 定义通用的旋转动作 let rotateOut = SKAction.rotate(toAngle: 25, duration: 1) let rotateBack = SKAction.rotate(toAngle: 0, duration: 1) // 组合成完整的动作序列 let gateActionSequence = SKAction.sequence([wait, rotateOut, rotateBack]) // 让两个闸门同时执行同一序列 leftGate.run(gateActionSequence) rightGate.run(gateActionSequence)
方法二:通过组合动作同时触发双闸门
利用SKAction.run在同一时间点触发两个闸门的动作,从根源保证同步:
// 生成统一的随机等待时长 let randomWaitDuration = 2 + Double.random(in: 0...5) let wait = SKAction.wait(forDuration: randomWaitDuration) // 创建同时控制两个闸门向外旋转的动作 let rotateBothOut = SKAction.run { self.leftGate.run(SKAction.rotate(toAngle: 25, duration: 1)) self.rightGate.run(SKAction.rotate(toAngle: 25, duration: 1)) } // 创建同时控制两个闸门复位的动作 let rotateBothBack = SKAction.run { self.leftGate.run(SKAction.rotate(toAngle: 0, duration: 1)) self.rightGate.run(SKAction.rotate(toAngle: 0, duration: 1)) } // 组合成完整的时序序列,让场景执行该动作 let combinedSequence = SKAction.sequence([wait, rotateBothOut, rotateBothBack]) self.run(combinedSequence)
内容的提问来源于stack exchange,提问作者Nexus S.
相关产品推荐
相关产品推荐

