将相机置于swift spritekit中的节点上

时间:2015-05-30 01:59:31

标签: swift sprite-kit

我正在Swift创建一个Terraria风格的游戏。我想拥有它,所以玩家节点总是在屏幕的中心,当你向右移动时,这些块就像Terraria一样向左移动。

我目前正试图弄清楚如何让视图以角色为中心。有谁知道实现这个目标的好方法?

3 个答案:

答案 0 :(得分:6)

自iOS 9 / OS X 10.11 / tvOS以来,SpriteKit包含SKCameraNode,这使得这很容易:

  • 定位摄像机节点会自动调整视口
  • 您可以通过在相机节点中进行变换轻松旋转/缩放相机
  • 您可以通过让HUD元素成为相机节点的子项来修复相对于屏幕的HUD元素
  • 场景的位置保持不变,所以像物理关节这样的东西不会打破他们通过移动世界来模仿相机时所做的事情

将摄像机节点与另一个新功能SKConstraint结合使用时效果会更好。您可以使用约束来指定摄像机的位置始终以角色为中心...或添加额外的约束,例如,相机的位置必须保持在边缘的某个边缘内世界。

答案 1 :(得分:5)

以下将相机置于特定节点的中心位置。它还可以在设定的时间范围内平滑过渡到新位置。

class CameraScene : SKScene {
    // Flag indicating whether we've setup the camera system yet.
    var isCreated: Bool = false
    // The root node of your game world. Attach game entities 
    // (player, enemies, &c.) to here.
    var world: SKNode?
    // The root node of our UI. Attach control buttons & state
    // indicators here.
    var overlay: SKNode?
    // The camera. Move this node to change what parts of the world are visible.
    var camera: SKNode?

    override func didMoveToView(view: SKView) {
        if !isCreated {
            isCreated = true

            // Camera setup
            self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            self.world = SKNode()
            self.world?.name = "world"
            addChild(self.world)
            self.camera = SKNode()
            self.camera?.name = "camera"
            self.world?.addChild(self.camera)

            // UI setup
            self.overlay = SKNode()
            self.overlay?.zPosition = 10
            self.overlay?.name = "overlay"
            addChild(self.overlay)
        }
    }


    override func didSimulatePhysics() {
        if self.camera != nil {
            self.centerOnNode(self.camera!)
        }
    }

    func centerOnNode(node: SKNode) {
        let cameraPositionInScene: CGPoint = node.scene.convertPoint(node.position, fromNode: node.parent)

        node.parent.position = CGPoint(x:node.parent.position.x - cameraPositionInScene.x, y:node.parent.position.y - cameraPositionInScene.y)
    }

}

通过移动相机来改变世界上可见的内容:

// Lerp the camera to 100, 50 over the next half-second.
self.camera?.runAction(SKAction.moveTo(CGPointMake(100, 50), duration: 0.5))

来源:swiftalicio - 2D Camera in SpriteKit

有关其他信息,请查看Apple的SpriteKit Programming Guide(示例:在节点上居中显示场景)。

答案 2 :(得分:0)

您必须创建包含节点的World节点。你应该以{{1​​}}为例(0.5,0.5)。在你的播放器上居中。然后你应该移动你的播放器。

anchorPoint