Swift Spritekit滚动背景

时间:2014-11-27 13:39:57

标签: ios swift scroll sprite-kit

我正在尝试找到在Swift中垂直滚动背景的最佳方法, 不使用更新方法。背景是1应该循环无限的图像。 图像应位于屏幕中间(全尺寸),向下移动,并且该图像顶部应始终是另一个图像生成。

然而,我的工作并不正确,它产生2张图像,而且在延迟之后它们会弹出并再次启动动作。 此外,它有时会从30 FPS下降到26,这是我想要避免的。 我希望有人能够帮助我更好地帮助我。

let Background = SKTexture(imageNamed: "Background.png")
    Background.filteringMode = .Nearest

    let BackgroundMove = SKAction.moveByX(0, y: -self.frame.size.height, duration: 10)
    let BackgroundReset = SKAction.moveByX(0, y: self.frame.size.height, duration: 0.0)
    let BackgroundMoveAndResetForever = SKAction.repeatActionForever(SKAction.sequence([BackgroundMove,BackgroundReset]))

    for var i:CGFloat = 0; i < 2.0 + self.frame.size.height / (Background.size().height * 2); ++i {
        let sprite = SKSpriteNode(texture: Background)
        sprite.size = CGSize(width: self.frame.size.width / 2, height: self.frame.size.height)
        sprite.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2 * i)
        sprite.zPosition = 1
        sprite.runAction(BackgroundMoveAndResetForever)
        self.addChild(sprite)
    }

3 个答案:

答案 0 :(得分:8)

这是我用来制作在屏幕上从右到左移动的背景的代码。它使用一个循环来生成三个背景,所有这些背景形成一条线,它穿过屏幕并在完成时返回到它们的原始位置。要将其转换为从上到下移动的屏幕,您必须将moveByX SKActions替换为moveToY,并通过更改y值来更改x值。希望这有帮助!

func makeBackground() {

    var backgroundTexture = SKTexture(imageNamed: "img/bg.png")

    //move background right to left; replace
    var shiftBackground = SKAction.moveByX(-backgroundTexture.size().width, y: 0, duration: 9)
    var replaceBackground = SKAction.moveByX(backgroundTexture.size().width, y:0, duration: 0)
    var movingAndReplacingBackground = SKAction.repeatActionForever(SKAction.sequence([shiftBackground,replaceBackground]))

    for var i:CGFloat = 0; i<3; i++ {
        //defining background; giving it height and moving width
        background=SKSpriteNode(texture:backgroundTexture)
        background.position = CGPoint(x: backgroundTexture.size().width/2 + (backgroundTexture.size().width * i), y: CGRectGetMidY(self.frame))
        background.size.height = self.frame.height
        background.runAction(movingAndReplacingBackground)

        self.addChild(background)
    }
}

答案 1 :(得分:1)

我写了这个...它可能没有那么短,但它只使用了2个图像副本,不像上面发布的最佳答案。它还允许您指定方向(向右滚动为true,向左滚动为false)和速度(表示图像在屏幕上滚动所需的秒数,较低的数字=更快)。它还要求你指定视图,我没有使用与所需输出大小不同的图像进行测试(虽然我包括缩放,所以它可能有效)

func scrollingBackground (view: SKView, rightward: Bool, speed: CGFloat) {

    let background = SKSpriteNode(imageNamed: "space")
    let background2 = SKSpriteNode(imageNamed: "space")

    // variables to manage x position, will be set based on which
    // direction this will be moving
    var b1startX, b2startX, destination, resetPos: CGFloat

    // Set values based on desired direction
    if(rightward){
        b1startX = frame.size.width * -0.5      // value to start offscreen
        b2startX = frame.size.width * 0.5       // value to start on screen
        destination = frame.size.width * 1.5    // position where image will disappear
        resetPos = frame.size.width * -0.5      // position where image will reappear
    }
    else{
        b1startX = frame.size.width * 1.5
        b2startX = frame.size.width * 0.5
        destination = frame.size.width * -0.5
        resetPos = frame.size.width * 1.5
    }

    background.position = CGPoint(x: b1startX, y: frame.size.height / 2)
    background.scale(to: view.bounds.size)
    background.zPosition = -1

    background2.position = CGPoint(x: b2startX, y: frame.size.height / 2)
    background2.scale(to: view.bounds.size)
    background2.zPosition = -1

    // Define actions based on desired direction
    let scrollFromMid = SKAction.moveTo(x: destination, duration: TimeInterval(speed))
    let scrollFromLeft = SKAction.moveTo(x: destination, duration: TimeInterval(speed * 2.0))
    let resetPosition = SKAction.moveTo(x: resetPos, duration: 0)

    //background starts in the default starting position, totally offscreen
    background.run(SKAction.repeatForever(SKAction.sequence([scrollFromLeft, resetPosition])))

    // background2 starts fully displayed, moves offscreen, then into default loop
    background2.run(SKAction.sequence([scrollFromMid, resetPosition,
                    SKAction.repeatForever(
                        SKAction.sequence([scrollFromLeft, resetPosition]))
                    ]))

    addChild(background)
    addChild(background2)

}

答案 2 :(得分:0)

创建BackgroundReset操作时,将y更改设置为负值,这会将背景向下移动到屏幕下方。删除减号以将背景移回屏幕。

let BackgroundReset = 
SKAction.moveByX(0, y: /* removed minus sign here */ self.frame.size.height * 2, duration: 0.0)