2016-06-18 6 views
2

レベルジェネレータでSKSpriteNodeを作成しました。SWIFTのSKSpriteNodeからCGPathを作成する方法

square1

私はCGPathにを使用して、正確に同じ形状を作成する必要があります。

self.firstSquare = childNodeWithName("square") as! SKSpriteNode 

    var transform = CGAffineTransformMakeRotation(self.firstSquare.zRotation) 
    let rect = CGRect(origin: self.firstSquare.position, size: self.firstSquare.size) 
    let firstSquareCGPath:CGPath=CGPathCreateWithRect(rect, &transform) 
    print(self.firstSquare.position) 

=> firstSquare位置(52.8359451293945、-52.9375076293945)

私が好きな私のCGPathには作成されているかどうかを確認するために、私は私のCGPathにしてSKShapeNodeを作成しました:

let shape:SKShapeNode=SKShapeNode(path:path) 
shape.fillColor = self.getRandomColor() 
addChild(shape) 
print(shape.position) 

=>形状の位置(52.8359451293945、-52.9375076293945)

結果は私が期待したものではありません。

enter image description here

だから私のCGPathには間違っている場合、私は知らない、または私は最初のスプライトプロパティを失うことSKShapeNodeでそれを変換するときにだ場合。

私はそれをする必要がある理由

を理解するには、EDIT this stack

1,2

をお読みください私が追加:

shape.position = self.firstSquare.position 

そして、私が得た:

enter image description here

EDIT 3:

私は私のfirstSquareのアンカーポイントは、通常、私は.SKSファイルを使用していない(0.5、0.5)今

答えて

0

解決策が見つかりました。SKShapeNode(path:, centered:)を使用して変換を適用し、位置を設定する必要があります。

self.firstSquare = childNodeWithName("square") as! SKSpriteNode 

let firstSquareCGPath:CGPath=CGPath(rect: CGRect(origin: self.firstSquare.position, size: self.firstSquare.size), transform: nil) 

let shape:SKShapeNode=SKShapeNode(path: firstSquareCGPath, centered: true) //important 
shape.zRotation = self.firstSquare.zRotation 
shape.position = self.firstSquare.position 
shape.fillColor = SKColor.blue() 
addChild(shape) 

これは完全に機能します。

最後に(SKShapeNodeプロパティのために)変換と位置を設定すると、上記のCGPathが正しく設定されているかどうかわかりません(SKSpriteNodeなど)。

1

で、私はここだけのコードを書くことpreefer、しかし、上記の私の説明を更新しますあなたは単に2つの正方形を持っているように見えます。元の.sksの位置を持つものと、2番目の時間に位置がなくなるものがあります。

単にあなたの最初の正方形をオーバーレイしたい場合:

shape.position = self.firstSquare.position 

EDIT

私はまた、あなたのanchorPointは(0.0,0.0)にsettedた見たが、デフォルトのアンカーポイントがある(0.5を、0.5)。あなたのskと一致するようにこのパラメータも修正してみてください。

あなた.sksサイズのレイアウトはそうではなく、シーンと同じにすることができます

scene.scaleMode = .ResizeFill 

に:あなたはあなたのシーンを提示する前に

scene.size = skView.bounds.size 

を変更するには、このパラメータにも見てみてください。実際、スケールモードは位置決めにも影響します。

scaleModeとはとは何ですか?

シーンのスケールモードは、iOSデバイスが回転したときにシーンを更新してビューを満たす方法を決定します。

SKSceneScaleModeFill - x軸とy軸はそれぞれ、シーンが表示されるように拡大縮小されます。シーンのコンテンツは現在のアスペクト比を維持しません。これはシーンにscaleModeを指定しない場合のデフォルトです。

SKSceneScaleModeAspectFill - xとyの両方の倍率が計算されます。より大きなスケールファクタが使用されます。これにより、ビューが塗りつぶされますが、通常はシーンの一部が切り取られます。シーン内の画像は通常拡大されますが、正しいアスペクト比が維持されます。

SKSceneScaleModeAspectFit - xとyの両方の倍率が計算されます。より小さなスケールファクターが使用されます。これにより、シーン全体が表示されますが、通常はシーンがレターボックス化されます。シーン内の画像は通常縮小されますが、正しいアスペクト比が維持されます。

SKSceneScaleModeResizeFill - シーンの縮尺が変更されていません。ビューに収まるように単純にサイズ変更されます。シーンはスケーリングされていないため、画像はすべて元のサイズとアスペクト比に維持されます。コンテンツはすべてシーンの原点(左下)に関連して残ります。

+0

私の編集を参照してください、動作していないようです。 – cmii

+0

よく見る編集セクション –

+0

Ok、アンカーポイントを(0.5、0.5)に設定して説明を更新しました。結果はまだ私が必要なものではありません。 – cmii

関連する問題