SKNode
メソッドconvertPoint:fromNode:
とconvertPoint:ToNode:
がどのように機能しているかに少し混乱しています。ドキュメントを見てきましたが、それらが何をしているのかはそれほど明白ではありません。たとえば、これ(下の図を参照)はconvertPoint:fromNode:
を使用して行った小さなテストです。黒い領域はSKScene
の背景で、青い領域はSKSpriteNode
の親であるSKScene
、赤い領域です。青いスプライトの親である別のSKSpriteNode
です。両方のスプライトのアンカーポイントは、小さな緑色の点で示されています。私がやりたかったのは、次のコードを使用して行った、赤いスプライトのシーン位置を取得することでした。
CGPoint positionInScene = [self convertPoint:[self position]
fromNode:[self redSprite]];
これによる結果は
positionInScene = [105, 205]
それがシーン空間の赤の広場の起源であるため、これは私が期待したことです。私が混乱しているのは議論です。私が推測できることから:
[SKNode_A convertPoint: CGPoint_B toNode: SKScene_C]
赤いスプライトのオリジンをシーンに変換したかったので、これを最初に試したのは[self convertPoint:[redSprite position] fromNode:redSprite]
でした。頭を丸めるのは少し不格好なようです。誰かがこれとその友人の両方に少し光と論理を投げかけることができればconvertPoint:toNode:
それは非常にありがたいです。
これは本質的に言っています:別のノードで表現されたポイントを変換します座標系を呼び出し元の(self)座標系に変換します。重要なのは、これが機能するためには、ポイントをノードの座標系で表現する必要があるということです。スプライトの位置をポイントとして使用している場合は、スプライトの親ノードを最後の引数として渡す必要があります。
---(例:シーンの座標系での赤い正方形の位置を取得するには:
CGPoint positionInScene = [self convertPoint:[redSprite position]
fromNode:[self blueSprite]];
[5、5]blueSpriteの座標系->[105、205]シーンの座標系で
あなたの例:
CGPoint positionInScene = [self convertPoint:[self position]
fromNode:[self redSprite]];
[0、0]redSpriteの座標系->[105、205]シーンの座標系で
[自己位置]が[0、0]であり、redSpriteの座標系を使用したという理由だけで、コードから同じ結果が得られました。最初の試みは間近でした。redSpriteの位置が表される座標系を提供する必要がありました。これは、親Spriteの座標系です。この場合、それはblueSpriteです。
この方法は、最初の方法とは正反対です。呼び出し元の座標系のポイントを別のノードに変換します ' ■座標系。この方法の鍵は、与えられた点が呼び出し元の座標系で表現されなければならないということです。
---(例:シーンが[125、225]でタッチを受け、新しいスプライトを追加したいとします。その場所は、たまたまredSpriteのバウンディングボックス内にあります。したがって、redSpriteの子として新しいスプライトを追加するには、redSpriteの座標系でタッチの位置を取得する必要があります。それを取得するには:
CGPoint positionInRedSprite = [self convertPoint:touchLocation
toNode:[self redSprite]];
[125、225]シーンの座標系->[20、20]redSpriteの座標系で
Kevin。のすばらしい答えを読んだ後、SKNodeにいくつかの拡張を加えることができました。これは、すばらしい例であり、便利なツールセットでもあります。
_extension SKNode {
var frameInScene:CGRect {
get {
if let scene = self.scene {
if let parent = self.parent {
let rectOriginInScene = scene.convertPoint(self.frame.Origin, fromNode: parent)
return CGRect(Origin: rectOriginInScene, size: self.frame.size)
}
}
println("Just the normal frame, not the scene frame!!!")
return frame
}
}
var positionInScene:CGPoint {
get {
if let scene = self.scene {
if let parent = self.parent {
return scene.convertPoint(self.position, fromNode: parent)
}
}
println("Just the normal position, not the scene position!!!")
return position
}
}
}
_
おそらくすべての_self.
_を削除できると思いますが、コードがより混乱するように感じました。また、ノードがどのシーンにも親ノードにも属していない場合の対処方法が完全にはわからないため、通常のフレームと位置を返し、println()
を使用して警告を表示しました。
誰かがこのコードに変更/追加をした場合、特にそれが質問にさらに答えるのに役立つ場合は、それを聞いてみたいです。
これが遅い応答であることはわかっていますが、通常は、ノードの親をノードの位置の座標系として使用します。したがって、この拡張機能は非常に便利であることがわかりました。
extension SCNNode {
func convertPosition(node:SCNNode) -> SCNVector3 {
return self.convertPosition(node.position, fromNode:node.parentNode)
}
}
たとえば、これを呼び出す代わりに:
let position = scene.rootNode.convertPosition(node.position, fromNode: node.parentNode)
あなたはこれを単に呼ぶ:
let position = scene.rootNode.convertPosition(node)
簡単にするために:ノードBとノードAの位置を比較する場合(それらが互いにどれだけ離れているかを見つけようとします)
var BInSameCoordinateSys = NodeA.parent!.convertPoint(NodeB.position, fromNode: NodeB.parent!)
場所の視覚化に役立たない場合は、場所にスプライトを追加してトラブルシューティングを行います。
let childToSeeLocation = SKShapeNode(CircleWithRadius:50)
childToSeeLocation.fillColor = UIColor.redColor
ParentofA.addChild(childToSeeLocation)