使垂直移动背景

时间:2017-04-02 08:24:08

标签: ios swift swift3 sprite-kit

我是Spritekit的初学者,我试图让背景垂直移动 我知道怎么做 这就是控制器中的内容

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = GameScene(size: view.bounds.size)
        let skView = view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true
        skView.ignoresSiblingOrder = true
        scene.scaleMode = .resizeFill
        skView.presentScene(scene)
    }

这就是场景

class GameScene: SKScene {

var background = SKSpriteNode()
override func didMove(to view: SKView) {

    let backgroundTexture = SKTexture(imageNamed: "bbbgg.png")

    let shiftBackground = SKAction.moveBy(x: 0, y: -backgroundTexture.size().height, duration: 5)
    let replaceBackground = SKAction.moveBy(x: 0, y:backgroundTexture.size().height, duration: 0)
    let movingAndReplacingBackground = SKAction.repeatForever(SKAction.sequence([shiftBackground,replaceBackground]))

    for i in 1...3{
        background=SKSpriteNode(texture:backgroundTexture)
        background.position = CGPoint(x: 0, y: 0)
        background.size.height = self.frame.height
        background.run(movingAndReplacingBackground)

        self.addChild(background)
    }
}

}

问题是背景水平移动并在到达屏幕尽头后消失,然后再从屏幕开始移动

enter image description here

我想让它垂直工作而不会消失

1 个答案:

答案 0 :(得分:0)

背景水平移动,因为moveBy(shiftBackground,replaceBackground)的声明适用于x ax(水平)。你需要在y轴上工作(垂直)。

    let shiftBackground = SKAction.moveBy(x: 0, y: -backgroundTexture.size().height, duration: 5)
    let replaceBackground = SKAction.moveBy(x: 0, y: backgroundTexture.size().height, duration: 0)

在第一行,背景从它的位置移动到它的位置 - 它的高度。在第二行,它返回到第一个位置(我认为moveBy是相对的)。

_

后台再次移动,因为您使用了SKAction.repeatForever(movingAndReplacingBackground)函数。我想你可以删除它。

    let movingAndReplacingBackground = SKAction.sequence([shiftBackground,replaceBackground])

编辑:

我忘记了循环。

在循环中,您为背景提供初始位置。

            background.position = CGPoint(x: backgroundTexture.size().width/2 + (backgroundTexture.size().width * CGFloat(i)), y: self.frame.midY)

尝试将其替换为0,如果您想要立即可见的背景,请尝试将其替换为

        background.position = CGPoint(x: 0, y: self.frame.midY)

或 - 如果您希望背景显示在屏幕顶部,则为0。在这种情况下,您需要替换shiftBackground和replaceBackground

        background.position = CGPoint(x: -backgroundTexture.size().height, y: 0)

    and

    let shiftBackground = SKAction.moveBy(x: 0, y: backgroundTexture.size().height, duration: 5)

    let replaceBackground = SKAction.moveBy(x: 0, y: 0, duration: 0)

我不确定,但我认为,如果你只想要一个方法,你可以删除序列:

class GameScene: SKScene {

    var background = SKSpriteNode()
    override func didMove(to view: SKView) {

        let backgroundTexture = SKTexture(imageNamed: "bbbgg.png")

        let scrollByTopBackground = SKAction.moveBy(x: O, y: backgroundTexture.size().height, duration: 5)

        background = SKSpriteNode(texture:backgroundTexture)
        background.position = CGPoint(x: -backgroundTexture.size().height, y: self.frame.midY)
        background.size.height = self.frame.height
        background.run(scrollByTopBackground)

        self.addChild(background)
    }
}

编辑以回答你,试试这个......

class GameScene: SKScene {

var background = SKSpriteNode()
override func didMove(to view: SKView) {

    let backgroundTexture = SKTexture(imageNamed: "bbbgg.png")

    let shiftBackground = SKAction.moveBy(x: 0, y: -backgroundTexture.size().height, duration: 5)
    let replaceBackground = SKAction.moveBy(x: 0, y:backgroundTexture.size().height, duration: 0)
    let movingAndReplacingBackground = SKAction.repeatForever(SKAction.sequence([shiftBackground,replaceBackground]))

    for i in 0...2 {
        background=SKSpriteNode(texture:backgroundTexture)
        background.position = CGPoint(x: 0, y: self.frame.midY + (backgroundTexture.size().height * CGFloat(i)))
        background.size.height = self.frame.height
        background.run(movingAndReplacingBackground)

        self.addChild(background)
    }
}