You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同步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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:02:27