2017-01-24 3 views
5

パンニング後に境界線を設定してカメラを正しく見ることができません。だからここに私のシナリオです。パンニング時にカメラを正しく配置する

私は、画面よりも大きなノードを持っています。私は完全な地図を見るためにユーザーパンをしたいと思っています。ビューが640 by 1136の場合、私のノードは1000 by 1400です。マップノード内のスプライトには、デフォルトのアンカーポイントがあります。 次にマップノードにカメラを追加し、位置を(0.5, 0.5)に設定しました。

enter image description here

ユーザが画面をパンするとき、私はカメラの位置やマップノードを変更する必要がある場合は今、私は思ったんだけど?最初のアプローチは、位置が(0.5、0.5)と定義され、変換値がそれよりも大きいので、単にカメラの位置に翻訳を追加することができないため、問題があるようです。だから私はそれを倍増/画面サイズで分割しようとしましたが、それは動作していないようです。 2番目のアプローチはより良いですか?

var map = Map(size: CGSize(width: 1000, height: 1400)) 

override func didMove(to view: SKView) { 
    (...) 
    let pan = UIPanGestureRecognizer(target: self, action: #selector(panned(sender:))) 
    view.addGestureRecognizer(pan) 

    self.anchorPoint = CGPoint.zero 
    self.cam = SKCameraNode() 
    self.cam.name = "camera" 

    self.camera = cam 
    self.addChild(map) 
    self.map.addChild(self.cam!) 

    cam.position = CGPoint(x: 0.5, y: 0.5) 
} 

var previousTranslateX:CGFloat = 0.0 

func panned (sender:UIPanGestureRecognizer) { 
    let currentTranslateX = sender.translation(in: view!).x 

    //calculate translation since last measurement 
    let translateX = currentTranslateX - previousTranslateX 

    let xMargin = (map.nodeSize.width - self.frame.width)/2 

    var newCamPosition = CGPoint(x: cam.position.x, y: cam.position.y) 
    let newPositionX = cam.position.x*self.frame.width + translateX 

    // since the camera x is 320, our limits are 140 and 460 ? 
    if newPositionX > self.frame.width/2 - xMargin && newPositionX < self.frame.width - xMargin { 
     newCamPosition.x = newPositionX/self.frame.width 
    } 

    centerCameraOnPoint(point: newCamPosition) 

    //(re-)set previous measurement 
    if sender.state == .ended { 
     previousTranslateX = 0 
    } else { 
     previousTranslateX = currentTranslateX 
    } 
} 

func centerCameraOnPoint(point: CGPoint) { 
    if cam != nil { 
     cam.position = point 
    } 
} 
+0

カメラの(0.5、0.5)位置はどこから取得していますか? – Confused

+0

待っています。私はあなたが何をしたかを見ていると思います...あなたはXcodeからデフォルトのテンプレートを使い始めましたか?シーンのアンカーポイントを変更していない? – Confused

+0

anchorPoint(そのように定義することができます)とカメラの位置をミックスしました。この場合、中心から0.5ピクセルです。 'didLoad'にシーンのanchorPointを0.0に設定しました。そうでなければそれらに触れていない。 – owca

答えて

4

カメラの位置は、実際には中心から0.5ポイント右に0.5ピクセル上がります。 (0、0)のとき、カメラは画面の中央にあります。

あなたが作った間違いは、シーンのアンカーポイント(0.5、0.5)がシーンの中心座標と同じであると考えて、概念的なものだと思います。

ピクセルで作業していると思われる場合、カメラの位置は(500、700)がマップの右上に表示され、(-500、-700)は下になります左。

これは、Xcode SpriteKitテンプレートでデフォルトになっている中間点アンカーを使用していることを前提としています。

あなたの質問に対する答えは次のとおりです。地図上で文字通りカメラを動かしてみましょう。ピクセルリテラルな知識があることは自信があります。 1つの警告付き

...

ゲームの多くは、マップが画面にオフ半々にならないように、それはマップの端に到達する前に多少のカメラを停止するように制約を使用しています。このようにして地図の端が表示されますが、カメラが最も遠くに移動するだけで、地図の端が表示されます。歩く/移動することができるプレーヤー/キャラクターがエッジに移動したときに、これは制約に基づいた作業になりますが、カメラはそこまで完全には行きません。

+1

丁寧な答え。 –

関連する問題