2017-02-20 14 views
1

私はノードツリーが表示矩形に正確に収まるように正しいスケーリング係数を決定しようとしているので、すべてのノードの周りで最小の境界矩形を見つけようとしています。 Appleのドキュメントによると、calculateAccumulatedFrameは、ノードの内容とそのすべての子孫の内容を含む親座標系の矩形を計算します。それは私の必要なもののように聞こえるが、それは私に私が期待する緊密なフィット感を与えていない。calculateAccumulatedFrameで予期しないCGRectが発生するのはなぜですか?

import SpriteKit 
import PlaygroundSupport 

let view:SKView = SKView(frame: CGRect(x: 0, y: 0, width: 800, height: 800)) 

PlaygroundPage.current.liveView = view 

let scene:SKScene = SKScene(size: CGSize(width: 1000, height: 800)) 
scene.scaleMode = SKSceneScaleMode.aspectFill 
view.presentScene(scene) 

let yellowBox = SKSpriteNode(color: .yellow, size:CGSize(width: 300, height: 300)) 
yellowBox.position = CGPoint(x: 400, y: 500) 
yellowBox.zRotation = CGFloat.pi/10 
scene.addChild(yellowBox) 

let greenCircle = SKShapeNode(circleOfRadius: 100) 
greenCircle.fillColor = .green 
greenCircle.position = CGPoint(x: 300, y: 50) 
greenCircle.frame 
yellowBox.addChild(greenCircle) 

let uberFrame = yellowBox.calculateAccumulatedFrame() 

let blueBox = SKShapeNode(rect: uberFrame) 
blueBox.strokeColor = .blue 
blueBox.lineWidth = 2 
scene.addChild(blueBox) 

そして結果は以下のとおりです:私の完全な遊び場コードがある青い四角形の Playground results

左と下縁は良く見えるが、なぜ青い長方形と上の緑の円の間にギャップがありますトップと右?

答えて

2

「フレーム」という概念は、トランスフォームを追加すると面白いことをします。ボックスと円の周りの境界ボックスは四角形です。あなたはその矩形を回転させました。したがって、そのコーナーが突き出ています。蓄積されたフレームは、突き出た隅を含む回転した矩形を包含する。 の描画された外観(例えば、円)のノードを魔法のように抱かせることはありません。

enter image description here

+0

これは意味があります。 「フレームは、サブツリー内の各ノードのxScale、yScale、およびzRotationプロパティの累積的な影響をアカウントに取り込みます」と、各ノード(尺度と回転を含む)に対して四角形が計算されたと考えました。あなたが説明したものの代わりに、彼らはすべて団結していました。ありがとう。 – mike663

+0

ノードごとに長方形が計算されても、それは_rectangle_です。あなたのサークルが長方形であるとふりをすると、これはあなたにとってははるかに意味をなさないでしょう。確かに、あなたの円を矩形で描く;何が起こっているのかをより良く理解することができます。 – matt

+0

良い提案。 greenCircleからgreenBoxに変更すると、回転した四角形の周りにブルーボックスがぴったりと表示されます。再度、感謝します。 – mike663

関連する問題