2017-01-25 6 views
2

私はSwiftとSpriteKitを使ってアプリケーションを構築しています。アプリは、画面のサイズとまったく同じSKSpriteNodeを読み込んで、画面を正確に覆うように配置します。しかし、ユーザーはこのSKSpriteNodeを好きなだけ移動してズームすることができます。私はSKSpriteNodeの絶対位置を気にしています。なぜなら、ノードがあまり動かされないと、私はそれを中心に戻したり、画面の端に「スナップ」したいからです。 (SKSpriteNodeは最終的にマップを保持します)。SpriteKitの奇妙さの拡大

ノードのスケールが正確に1.0の場合、位置の値は期待通りに機能します。しかし、(ピンチジェスチャーを使用して)ノードをズームし、スケールが1.0より大きくなると、位置の値は意味をなさない。私が何を意味しているかを説明するいくつかの画像があります。ここで

、あなたは非ズームノードはシーンと全く同じ大きさと位置を持っていることがわかります、それはXとYに配置された各地図だけでなく、シーンの両方0です:

enter image description here

しかし、この次の画像でわかるように、マップを拡大してより大きなSKSpriteNodeにすると、マップの左下隅が画面の左下隅に正確に配置されるように移動しますズームされたノードのXとYの値はオフです。私はXが0、Yが0と期待しますが、そうではありません。ここで何が起こっている

enter image description here

、そしてどのように私はズームノードの絶対位置を計算するのですか?そして、私が「絶対的な」ポジションを言うとき、おそらく私が意味することは、シーンに相対的なポジションですか?とにかく、あなたの考えは高く評価されます。

答えて

0

私はこれを理解しましたが、それは容易ではありませんでした。それは "AnchorPoint Dorkitis"のケースであることが判明しました。この条件の主な症状は、誤った仮定に基づいてコードを書くことです。私の場合は、私の前提は次のとおりです。

私のノードの(X、Y)点は、ノード(:0.5、Y:0.5×)が、これもということ、それはまだ私のためで沈んでいなかった私は、私が(シーンだけでなく、SKSpriteNode両方の)私のAnchorPointsを設定し、すべてのことに沿って知っていた(偽)

スクリーン上で(X、Y)座標が実際にどこにあるか(ヒント:中心)を変更していました。

興味のある方には、私のシーンと私のSKSpriteNodeのX、Y、高さ、幅、上、下、左、右の値を返すための計算されたプロパティセットを試しました。私はここで、あなたにそれらを共有する:

var map_x: Int { 
    get { 
     return Int(self.position.x) 
    } 
} 

var map_y: Int { 
    get { 
     return Int(self.position.y) 
    } 
} 

var map_h: Int { 
    get { 
     return Int(self.frame.height) 
    } 
} 

var map_w: Int { 
    get { 
     return Int(self.frame.width) 
    } 
} 

var map_t: Int { 
    get { 
     return Int(self.position.y + self.frame.height/2) 
    } 
} 

var map_b: Int { 
    get { 
     return Int(self.position.y - self.frame.height/2) 
    } 
} 

var map_l: Int { 
    get { 
     return Int(self.position.x - self.frame.width/2) 
    } 
} 

var map_r: Int { 
    get { 
     return Int(self.position.x + self.frame.width/2) 
    } 
} 

var scene_x: Int { 
    get { 
     return Int((scene?.position.x)!) 
    } 
} 

var scene_y: Int { 
    get { 
     return Int((scene?.position.y)!) 
    } 
} 

var scene_h: Int { 
    get { 
     return Int((scene?.frame.height)!) 
    } 
} 

var scene_w: Int { 
    get { 
     return Int((scene?.frame.width)!) 
    } 
} 

var scene_t: Int { 
    get { 
     return Int((scene?.position.y)! + (scene?.frame.height)!/2) 
    } 
} 

var scene_b: Int { 
    get { 
     return Int((scene?.position.y)! - (scene?.frame.height)!/2) 
    } 
} 

var scene_l: Int { 
    get { 
     return Int((scene?.position.x)! - (scene?.frame.width)!/2) 
    } 
} 

var scene_r: Int { 
    get { 
     return Int((scene?.position.x)! + (scene?.frame.width)!/2) 
    } 
} 

私はそれらCGFloat値行い、INT()でそれらをラップしていないが、私は他の場所で、私はここにもあることを行うことを考え出したので、コード内のint型を必要としている可能性があります。私は次のステップは、より少ないコード行でこれを行う方法を理解することだと思います。

+0

これらのプロパティからgetを削除できます。 – Whirlwind

+0

getを削除しても、それでも計算されたプロパティですか?アップルデベロッパーガイドでは、Setのみがオプションであると述べています。 – zeeple

+0

'get'を削除しても' return'のままにすると、同じ動作になります。そうすれば、これらのプロパティは計算され、get-onlyです。 – Whirlwind

関連する問題