Spritekit - 将场景保持在精灵高于特定高度的中心

时间:2016-08-04 10:06:20

标签: swift sprite-kit

在我的游戏中,相机以英雄为中心,但仅限于x轴。当他向左或向右移动时,相机(场景)与他一起移动,但当他跳跃时保持不变。

可以简单地复制设置:

import SpriteKit

class GameScene: SKScene {

    let ship = SKSpriteNode(imageNamed: "Spaceship")
    let ground = SKShapeNode(rectOfSize: CGSizeMake(600, 30))

    let world = SKNode()

    override func didMoveToView(view: SKView) {

        self.anchorPoint = CGPointMake(0.5, 0.5)

        self.ship.setScale(0.2)
        self.ship.physicsBody = SKPhysicsBody(circleOfRadius: self.ship.size.width / 2)

        self.ground.position = CGPointMake(0, -200)
        self.ground.fillColor = SKColor.redColor()
        self.ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(600, 30))
        self.ground.physicsBody?.dynamic = false

        world.addChild(self.ship)
        world.addChild(self.ground)

        self.addChild(world)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.ship.physicsBody?.applyImpulse(CGVectorMake(0, 60))
    }

    override func didFinishUpdate() {
        let cameraPositionInScene = self.convertPoint(self.ship.position, fromNode: world)

        // the position is updated only in the x axis
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y)
    }
}

然而,一旦英雄达到一定高度,我希望相机在y轴上移动(这样他可以继续升高,以防水平上升“在云中”)。

我尝试将didFinishUpdate()函数中的位置更新更改为:

if self.ship.position.y > 100 {
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y - cameraPositionInScene.y)
    } else {
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y)
    }

它确实开始跟随船高于一定高度,但从未完全回到原来的位置,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

didFinishUpdate()方法中,只有当船舶的y坐标高于100时才会改变世界的y坐标。在船舶从105下降到95的情况下,世界&#39; sy坐标不再更新。

我希望删除if语句并始终更新世界位置以考虑您的相机位置以帮助您。

编辑:
我已经提出了一些示例代码,我将使用SKCameraNode,因为我真的认为这样可以避免将来的麻烦。我没有运行这个,所以你可能不得不在这里和那里抵消一些东西。无论有没有SKCameraNode,我都为这样的相机功能编写了代码,这是一个很好的类,框架基本上是免费的。

override func didMoveToView(view: SKView) {
  // ...
  camera = SKCameraNode()
  // ...
}

override func didFinishUpdate() {
  var cameraPosition = CGPointMake(self.ship.position)
  cameraPosition.y = MAX(0,cameraPosition.y - 100)
  self.camera.position = cameraPosition
}