2016-08-04 10 views
0

In meinem Spiel ist die Kamera auf den Helden zentriert, aber nur in der x-Achse. Die Kamera (die Szene) bewegt sich mit ihm, wenn er sich nach links oder rechts bewegt, bleibt aber gleich, wenn er springt.Spritekit - Szene über Sprite über einer bestimmten Höhe zentriert halten

kann das Setup einfach so wiedergegeben werden:

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

Allerdings habe ich die Kamera in der y-Achse bewegen mag, wenn der Held eine bestimmte Höhe erreicht hat (so dass er höher ging weiter zu falls ein Level "in den Wolken" steigt.

Ich habe versucht, die Position Update in der didFinishUpdate() Funktion auf diese Veränderung: ab einer bestimmten Höhe nach dem Schiff

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

Und es tatsächlich beginnt, aber nie geht vollständig zurück in seine ursprüngliche Position, und ich konnte nicht herausfinden, warum.

+0

Ich weiß, das hilft nicht mit dieser Frage, aber haben Sie in SKCameraNode untersucht? Es könnte Ihr Problem als Nebeneffekt lösen. – CloakedEddy

Antwort

1

In Ihrer didFinishUpdate()-Methode ändern Sie die Y-Koordinate der Welt nur, wenn die Y-Koordinate des Schiffes über 100 liegt. In dem Szenario, in dem das Schiff von 105 auf 95 sinkt, wird die Y-Koordinate der Welt nicht mehr aktualisiert.

Ich erwarte, die if-Anweisung zu entfernen und immer die Weltposition zu aktualisieren, um Ihre Kameraposition zu berücksichtigen, um Ihnen zu helfen.

EDIT:
Ich habe ein paar Beispielcode, und ich werde SKCameraNode verwenden, weil ich wirklich denke, dass dies Ihnen Kopfschmerzen in der Zukunft speichern wird. Ich habe das nicht ausgeführt, also musst du hier und da etwas ausgleichen. Ich habe Code für solche Kamera-Funktionalität geschrieben, sowohl mit als auch ohne SKCameraNode, und es ist eine nette Klasse, die Ihnen das Framework grundsätzlich kostenlos zur Verfügung stellt.

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 
} 
+0

Ja, aber ich möchte die Y-Achse nur aktualisieren, wenn das Zeichen über einer bestimmten Höhe ist. Im normalen Betrieb erreicht ein Sprung diese Höhe nicht und die Kamera bewegt sich nicht in der y-Achse. Erst nach dem Springen auf ein paar Blöcke usw. folgt die Kamera dem Zeichen in der y-Achse. –

Verwandte Themen