斯威夫特游戏场景随时间改变垂直移动的背景?



我有一个 1500 x 600 像素的移动背景,并使用以下代码不断在屏幕上垂直移动:

let bgTexture = SKTexture(imageNamed: "bg.png")
let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4)
let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0)
let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation]))
var i: CGFloat = 0
while i < 3 {
bg = SKSpriteNode(texture: bgTexture)
bg.position = CGPoint(x: self.frame.midX, y: bgTexture.size().height * i)
bg.size.width = self.frame.width
bg.zPosition = -2
bg.run(moveBGForever)
self.addChild(bg)
i += 1

}

我现在希望在x时间后出现一个新的背景,让玩家感觉正在进入游戏的不同部分。

我可以将此代码放入一个函数中并在 20 秒后使用 NSTimer 触发它,但将新 bg 的起始位置更改为屏幕外吗?

重复永远操作的问题在于你不知道它们在某个时刻的位置。NSTimers 没有您想要的那么精确,因此使用计时器可能会错过正确的时间或过早跳入,具体取决于渲染速度和帧速率。

我建议用bgAnimation替换你的moveBGForever作为你的移动和移位动作的序列。然后,当您运行 bgAnimation 操作时,您可以使用 { self.cycleComplete = true } 的完成块运行它。cycleComplete 将是一个布尔变量,指示操作序列是否已完成。在场景更新方法中,可以检查此变量是否为 true,如果是,则可以再次运行序列操作。不要忘记将 cycleComplete var 重置为 false。

也许这听起来更复杂,但可以让您控制是否要再运行一个周期。如果没有,那么您可以更改纹理并再次运行循环。

或者,您可以保持原样,只有在确保精灵位于可见区域之外(例如其 Y 位置>视图大小高度)后才能更改纹理。

在 SpriteKit 中,您可以将等待操作与完成块一起使用。这比使用 NSTimer 更直接。

所以,要回答你的问题 - 当使用动作在屏幕上移动精灵时,你不应该随时改变精灵的位置 - 这就是动作的作用。您只需要确保在位置不在屏幕时更新纹理。到时候,显然会显示一些精灵,所以你不能同时改变所有3个精灵的纹理。为此,您可能需要一个辅助变量来检查更新周期(如我上面建议的那样)并在适当的时候替换纹理(精灵 Y pos 在屏幕外)。

最新更新