在 SpriteKit 中如何对多个 Sprite 应用一个动作?

How do you apply one action to multiple Sprites in SpriteKit?

如果我的屏幕顶部有一个人,底部有一个人稍后进来,我希望他们都使用我的 moveToLeftOfScreen 移动到屏幕左侧我创建的操作,我该怎么做?

如果我有 var moveToLeftOfScreen = SKAction.moveTo(CGPoint(x:blhabhla, y:bhlahbla, duration: 3)) 将不允许某些东西从它产生的地方沿直线向左移动。

长话短说:你能做一个动作说 "Move to the left until you hit the screen, then move back to the right until you hit the screeN" 并将其应用于在不同时间在不同位置产卵的事物,然后只应用它在整个代码中需要时执行操作,而不是为每个高度编写不同的操作。

与sangony相反,我认为这是很有可能的,尽管我可能遗漏了一些东西。

您不能创建对 SKAction 的引用,它是移动到 X=0 和移动到 X=size.width 的序列吗?如果永远重复。

我不在我的 mac 附近,所以我无法在 XCode 中获得完美的语法,对于任何错误,我们深表歉意。此外,这假定场景将创建此引用,因此 self.size.width:

let moveLeft = SKAction.moveToX(0, duration: 3)
let moveRight = SKAction.moveToX(self.size.width, duration: 3)
let moveLeftThenRight = SKAction.sequence([moveLeft, moveRight])
let continousMovement = SKAction.repeatActionForever(moveLeftThenRight)

将最终操作应用于任何生成的节点,如果我理解正确的话,你应该没问题。

第一次移动会很慢,因为无论节点在哪里生成,它总是需要 3 秒才能向左移动。这可以通过获取它需要移动的距离的分数并将其乘以 3 来解决:

let firstMovementDuration = (node.position.x / self.size.width) * 3
let firstMoveLeft = SKAction.moveToX(0, duration: firstMovementDuration)

然后从那里继续正常运动。还有 timingMode 可以考虑更自然的运动,例如 .EaseInEaseOut