首页 > 解决方案 > 我正在尝试使用 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 设备。

标签: swiftxcodesprite-kit

解决方案


你的第一个 BG 在 y = 0,你的第二个 BG 在 y = height。我假设您在锚点 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)
    }

推荐阅读