我正在尝试使用 SpirteKit 创建无限垂直滚动背景,但我似乎无法让代码工作



循环计时不正确,重置太快。循环图像也被切断,仅显示其中的一小部分,而不是拼接到前一个的完整循环背景图像。

我尝试过使用 .position、.size 和 SKAction 值,但我似乎无法将其调整到正常工作的位置。

func scrollingBackground() {
    let BGTexture = SKTexture(imageNamed: "Background")
    for i in 0 ... 1 {
        let background = SKSpriteNode(texture: BGTexture)
        background.zPosition = -30
        background.anchorPoint = CGPoint(x: 0, y: 0)
        background.size = CGSize(width: (frame.size.width), height: (frame.size.height))
        background.position = CGPoint(x: 0, y: -BGTexture.size().height + (BGTexture.size().height + (BGTexture.size().height * CGFloat(i))))
        addChild(background)
        let scrollUp = SKAction.moveBy(x: 0, y: BGTexture.size().height, duration: 20)
        let scrollReset = SKAction.moveBy(x: 0, y: -BGTexture.size().height, duration: 0)
        let scrollLoop = SKAction.sequence([scrollUp, scrollReset])
        let scrollForever = SKAction.repeatForever(scrollLoop)
        background.run(scrollForever)
    }

我希望得到一个无限运行的无缝无限后台循环,而不是我目前拥有的这种跳跃的混乱。我可能会补充一点,我的背景图像最初的大小并不完全适合设备,但我想确保我的背景适合所有iPhone设备。

您的第一个 BG 在 y = 0,您的第二个 BG 在 y = 高度。 我假设您在锚点 0.5 0.5 上,这将使高度/2 离开屏幕。 您的操作将BG 1精确移动到屏幕外的位置,然后弹回0。 您的BG2从屏幕开始,继续离开屏幕,然后当它达到2 *高度时,重置为1 *高度,因此永远不会出现在屏幕上。 这将在底部出现黑条,因为BG2永远不会被绘制。 将i乘以负高度,这应该会导致BG2出现在底部。

func scrollingBackground() {
    let BGTexture = SKTexture(imageNamed: "Background")
    for i in 0 ... 1 {
        let background = SKSpriteNode(texture: BGTexture)
        background.zPosition = -30
        background.anchorPoint = CGPoint(x: 0, y: 0)
        background.size = CGSize(width: (frame.size.width), height: (frame.size.height))
        background.position = CGPoint(x: 0, y: -BGTexture.size().height + (BGTexture.size().height + (-BGTexture.size().height * CGFloat(i))))
        addChild(background)
        let scrollUp = SKAction.moveBy(x: 0, y: BGTexture.size().height, duration: 20)
        let scrollReset = SKAction.moveBy(x: 0, y: -BGTexture.size().height, duration: 0)
        let scrollLoop = SKAction.sequence([scrollUp, scrollReset])
        let scrollForever = SKAction.repeatForever(scrollLoop)
        background.run(scrollForever)
    }

最新更新