2016-09-19 14 views
3

私は車が惑星の周りを回る小さなゲームをしています。カメラは常に惑星から90度の角度で機械に向いています。私は惑星の質感がカメラと共に回転するという問題に遭遇しました。カメラが回転しない場合、テクスチャは正常に動作しています。これをどうやって解決するのですか?SpriteKit。回転を停止CameraNodeでテクスチャ

beizerPathから惑星を作成します。

planetTexture = SKTexture(imageNamed: "asanoha") 

planet = SKShapeNode(path: beizerPath.cgPath) 
planet.position = CGPoint(x: 0, y: 0) 
planet.zPosition = 10 
planet.physicsBody = SKPhysicsBody(polygonFrom: beizerPath.cgPath) 
planet.physicsBody?.isDynamic = false 
planet.physicsBody?.categoryBitMask = planetGroup 
planet.fillColor = SKColor.white 
planet.fillTexture = planetTexture 
planet.strokeColor = getRandomColor() 
planet.lineWidth = 7 
planet.glowWidth = 0.5 

sceneNode.addChild(planet) 

カメラの位置:

var cam = SKCameraNode() 

override func didMove(to view: SKView) { 
    self.camera = cam 
} 

let angle = atan2(car.position.y, car.position.x) 
let theta : CGFloat = 0.0 

let cx = (Float(a) * cosf(Float(angle - theta))) 
let cy = (Float(a) * sinf(Float(angle - theta))) 

cam.position = CGPoint(x: CGFloat(cx), y: CGFloat(cy)) 
cam.zRotation = angle - CGFloat(M_PI_2) 

My problem on video

答えて

2

この理由は、形状、塗りつぶしは画面空間で行われていることです。テクスチャは、テクスチャ座標を持つSKShapeNodeにマッピングされません。塗りつぶしカラーのように扱われます。

解決策は、SKSpriteNodeまたはSKCropNodeを使用することです。スプライトノードを使用している場合、画像は惑星の円形を得るために、すでにエッジの周りに透明度を持っています。クロップノードを使用する場合は、正方形のスプライトノードを子として追加し、そのマスクノードプロパティをシェイプノードに設定します。これによりレンダリングされるマスクされた部分が決定されます。

作物ノード方法は、このようなものになるだろう:私はちょうどあなたのビデオを見て、表情に関するいくつかの不正確な仮定をした私の答えを実現:

planetTexture = SKTexture(imageNamed: "asanoha") 
planetSprite = SKSpriteNode(texture: planetTexture) 
planetMask = SKShapeNode(path: beizerPath.cgPath) 
planetMask.fillColor = UIColor.white 
planet = SKCropNode() 
planet.maskNode = planetMask 
planet.addChild(planetSprite) 
sceneNode.addChild(planet) 

を更新。しかし、クリッピングノードのアプローチはまだ健全です。ちょっとスプライトノードを少しずつ設定して、テクスチャが繰り返されるようにするだけです。そのような巨大で不規則な(そしておそらく生成された)惑星にとっては、透明性を備えた純粋なスプライトは機能しません。

+0

素晴らしい答えです!どうもありがとうございました! SKCropNodeは完全に機能します。 SkShapeNodeはfillColorを持たなければならないことに注意してください。そうしないと、動作しません。 –

+0

@DmitriyRodyginもちろん、あなたは大丈夫です。 'maskNode'は、その子がレンダリングされてからアルファマスクとして使用されるように振る舞います(実際にはバッファは実際には必要ありません)ので、' maskNode'の子は必要です不透明なコンテンツを生成します。ちなみに、ようこそ - 私はあなたが非常に新しいことに気付きました。あなたはおそらくまだ編集できませんので、あなたが言及した変更を編集します。また、良い/有用であると思う質問と回答の両方に投票することができます(自分の質問に対する回答だけでなく、他の回答も)。 – jhabbott

+0

偉大な応答ありがとう! –

関連する問題