2016-05-02 12 views
0

Ich versuche gerade, meine Kamera meinem Spieler "orb" folgen zu lassen, wenn der Spieler bewegt wird. Ich habe die Position der Kamera so eingestellt, dass sie sich immer dann in die x-Position der Kugel bewegt, wenn die Kugel bewegt wird. Wenn die Kugel jedoch schnell bewegt wird, stößt der SKCameraNode ab und stottert, als würde er versuchen, die Position des Knotens zu erreichen. Ich habe gelesen, dass dies daran liegt, dass die Physik nach dem eigentlichen Update() läuft, aber ich habe keine Ahnung, wie ich das Problem lösen könnte. Gibt es eine Möglichkeit, dieses Problem zu beheben?SKCameraNode verharrt, wenn Spieler sich bewegt

HINWEIS: Ich möchte nicht, dass die Kamera immer auf die "Kugel" zentriert, sondern etwas verzögert wird, wenn sie der Kugel folgt, um ihr ein freies Gefühl zu geben. (Wenn der Sinn macht)

import SpriteKit 

    class GameScene: SKScene { 

    var orb = SKSpriteNode() 
    var Touch: UITouch? 
    let theCamera: SKCameraNode = SKCameraNode() 

    override func didMoveToView(view: SKView) { 

     let orbTexture1 = SKTexture(imageNamed:"orb.png") 

     orb = SKSpriteNode(texture: orbTexture1) 
     orb.name = "Orb" 
     orb.position = CGPointMake(300, 95) 
     self.addChild(orb) 

     theCamera.position = CGPointMake(300, 0) 
     theCamera.name = "Camera" 
     self.addChild(theCamera) 
     self.camera = theCamera 

    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      if nodeAtPoint(touch.locationInNode(self)).name == "Orb" { 
       Touch = touch as UITouch 
      } 
     } 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      if Touch != nil { 
       if touch as UITouch == Touch! { 
        let location = touch.locationInNode(self) 
         orb.position = location 
       } 
      } 
     } 
    } 


override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 

    let action = SKAction.moveToX(orb.position.x, duration: 0.5) 
    theCamera.runAction(action) 

    } 
} 
+1

Verwenden Sie keine SKActions innerhalb der Update-Funktion. – Abdou023

Antwort

1

Sie können dieses Problem lösen, indem Sie die didSimulatePhysics Methode nicht die Update-Methode.

die Update-Methode mit diesem ersetzen:

>  override func didSimulatePhysics() { 
>   let action = SKAction.moveToX(orb.position.x, duration: 0.5) 
>   theCamera.runAction(action) 
>  } 
+0

Das würde dir überhaupt nicht helfen, das einzige, was du hier machst, ist das Problem bis zum Ende des Updates zu verzögern, das Stottern wird immer noch passieren. – Knight0fDragon

0

Du das, weil bei jedem Update immer beeinflussen, führen Sie eine neue SKAction an Ihrer Kamera. Das bedeutet, dass Ihre Kamera in 1 Sekunde 60 Mal aufgefordert wird, in die Orb-Position zu gehen. Das bedeutet, dass Sie mit 60 Aktionen steuern können, wie sich Ihr Sprite bewegen soll, und alle kämpfen darum, Priorität zu bekommen.

Sie müssen die vorherige Aktion entfernen oder die vorherige Aktion beenden.

die Aktion zu entfernen, können Sie removeAllActions() oder removeAction(forKey:)

Dies natürlich nennen heißt, Sie müssen zunächst einen Schlüssel zu Ihrer Aktion zuweisen, theCamera.runAction(action, withKey:"cameraMove")

nun eine Kurz Möglichkeit, eine Aktion zu ersetzen ist nur zu Rufen Sie theCamera.runAction(action, withKey:"cameraMove"), weil die neue Aktion die vorhandene Aktion ersetzt, indem Sie es entfernen.

Ihre andere Option ist es, zu überprüfen, ob die Aktion existiert mit action(forKey:) Dann bestimmen, ob Sie weitere Maßnahmen verarbeiten müssen.

Verwandte Themen