swift deutsch Zentrieren der Kamera auf einem Knoten im schnellen Spritekit




spritekit sprite (3)

Ich erstelle in Swift ein Spiel im Terrarien-Stil. Ich möchte es so haben, dass der Spielerknoten immer in der Mitte des Bildschirms ist, und wenn du dich nach rechts bewegst, gehen die Blöcke links wie in Terraria.

Ich versuche gerade herauszufinden, wie man den Blick auf den Charakter zentriert. Kennt jemand einen guten Weg, dies zu erreichen?


Answer #1

Im Folgenden wird die Kamera auf einen bestimmten Knoten zentriert. Es kann auch über einen festgelegten Zeitraum problemlos an die neue Position übergehen.

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)
    }

}

Ändern Sie, was in der Welt sichtbar ist, indem Sie die Kamera bewegen:

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

Quelle: swiftalicio - 2D-Kamera in SpriteKit

Weitere Informationen finden Sie im Apple SpriteKit Programmierhandbuch (Beispiel: Zentrieren der Szene auf einem Knoten).


Answer #2

Sie müssen einen World-Knoten erstellen, der Knoten enthält. Und Sie sollten zum Beispiel Ankerpunkt (0.5,0.5) setzen. Zentriere deinen Player. Und dann solltest du deinen Player bewegen.

func centerOnNode(node:SKNode){

   let cameraPositionInScene:CGPoint = self.convertPoint(node.position, fromNode: world!)
   world!.position = CGPoint(x:world!.position.x - cameraPositionInScene.x, y: world!.position.y - cameraPositionInScene.y)
}


override func didSimulatePhysics() {
  self.centerOnNode(player!)
}

Answer #3

Seit iOS 9 / OS X 10.11 / tvOS enthält SKCameraNode , was vieles einfacher macht:

  • Durch die Positionierung des Kamera-Knotens wird das Ansichtsfenster automatisch angepasst
  • Sie können die Kamera einfach drehen und zoomen, indem Sie sie in den Kameraknoten transformieren
  • Sie können HUD-Elemente relativ zum Bildschirm korrigieren, indem Sie sie zum untergeordneten Element des Kamera-Knotens machen
  • Die Position der Szene bleibt unverändert, sodass Dinge wie Physik-Gelenke nicht so funktionieren, wie wenn man eine Kamera emuliert, indem man die Welt bewegt

Es wird noch besser, wenn Sie SKConstraint mit einem anderen neuen Feature, SKConstraint , SKConstraint . Sie können eine Abhängigkeit verwenden, um anzugeben, dass die Position der Kamera immer auf einem Zeichen zentriert ist ... oder zusätzliche Einschränkungen hinzufügen, um beispielsweise zu sagen, dass die Position der Kamera innerhalb eines bestimmten Randes der Weltgrenze bleiben muss.





sprite-kit