2016-05-02 9 views
0

現在、プレーヤーが移動されるたびにカメラを自分の "orb"に追従させようとしています。私はorbが動かされるたびに、orbのx位置にカメラの位置を設定しましたが、何らかの理由でorbが速く動かされると、SKCameraNodeはノードの位置まで追いつくように動かなくなります。実際の更新()の後に物理が実行されるためですが、問題の解決方法はわかりません。この問題を解決する方法はありますか?SKCameraNodeは、プレーヤーが移動するときに遅れます

注:カメラが常に「オーブ」の中心にくるのではなく、むしろオーブをたどるように少し遅らせることで、自由に動く感じを与えます。 (意味がある場合)

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

更新機能内でSKActionsを使用しないでください。 – Abdou023

答えて

1

これは、更新メソッドではなくdidSimulatePhysicsメソッドを使用して解決できます。

はこれでupdateメソッドを置き換えます

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

これはまったく役に立たないでしょう。あなたがここでやっている唯一のことは、アップデートの終わり近くまで問題を遅らせることです。 – Knight0fDragon

0

を更新するたびに、あなたはあなたのカメラに新しいSKActionを装着しているので、あなたは、これが影響してきています。これは、1秒後に、あなたのカメラにorbの位置に移動するために60回告げられていることを意味します。これは、スプライトの移動方法を制御する60個のアクションを持っていることを意味し、すべて優先順位を得るために戦っています。

前の移動操作を削除するか、前の操作を完了させるだけです。アクションを削除するには

、あなたはもちろんremoveAllActions()またはremoveAction(forKey:)

これを呼び出すことができますが、最初にあなたのアクションにキーを割り当てる必要があることを意味し、theCamera.runAction(action, withKey:"cameraMove")

今すぐアクションを交換する簡単な方法は、ちょうどにありますtheCamera.runAction(action, withKey:"cameraMove")に電話してください。これは新しいアクションが既存のアクションを置き換えるため、削除します。

あなたの別のオプションは、アクションが存在するかどうかを確認することです。action(forKey:)次に、それ以上のアクションを処理する必要があるかどうかを判断します。

関連する問題