2016-11-20 4 views
2

シンプルなシーンをいくつか追加しました。SpriteKit:blendModeでレイヤーに穴を開ける方法

ここでは、私が集中したい要素と同じ位置にマスク全体をカットした特定の要素に焦点を当てたいと思います。一部のチュートリアルを初めて表示したときに、いくつかのゲームで見ることができるものと非常によく似ています。

基本的にはalpha=0.7のフルスクリーンレイヤーを追加しています(ユーザーはまだすべてのコンテンツを表示しています)が、このレイヤーの子として特定の位置に円を追加してblendMode=と設定します。これを減算すると、このフルスクリーンレイヤーからサークルを「カット」して、このサークル内ではっきりと見えるようになります。

すべての要素を画面に追加した後、次のコードを書いています。

// before this code i added some basic elements like circles and backgrounds 
let mask = SKSpriteNode(color: .blackColor(), size: self._screenSize) 
mask.anchorPoint = CGPoint.zero 
mask.position = CGPoint.zero 
mask.zPosition = 100 
mask.alpha = 0.7 

let circle = SKShapeNode(circleOfRadius: Constants.Config.playersize*2) 
circle.fillColor = .blackColor() 
circle.lineWidth = 0 
let circle_mask = SKSpriteNode(texture: SKView().textureFromNode(circle, crop: circle.frame)) 
circle_mask.blendMode = .Subtract 
circle_mask.zPosition = 101 

// now show the layer with alpha=0.7 and the circle mask being at the same position as my player element i want to focus on 
mask.addChild(circle_mask) 
circle_mask.position = player.position 
self.addChild(mask) 

しかしこれは、フルスクリーンレイヤーを追加するだけで、円の穴は追加しません。 circle_maskノードを無視しているように見えます。私は間違って何をしていますか?

私の計画では、このシーンの他の要素に焦点を合わせるためにサークルマスクを移動し続けます。私が理解するように。それは親ノードからのみ減算する必要があります。これはフルスクリーンのレイヤーでalpa=0.7です。

私はSKCropNodeで試しました。子としてフルスクリーンレイヤーをクロップノードに追加し、サークルをマスクとして割り当てました。しかし、今ではほとんどすべてをカットしていますが、私のフルスクリーンレイヤーのサークルを表示するだけで、実際にはこの切り抜きノードの逆の結果が必要です。

するBlendModeに問題はそれが最終的なフレームバッファ上でそれを実行しますが、私は何を必要とするだけで親ノード上でそれを実行することであるので、ここで.Subtract

+0

サークルマスクに円を追加することはありません。テクスチャ、それは何にも溶けない。サークルマスクを完全なブラックボックスにします。子として円を追加します。アルファブレンディングが入り込んで穴を作ります。また、マスキングはアルファレベルでは機能しません。単にオン/オフしているので、透明なテクスチャを通常のテクスチャとして追加する必要があります。穴をパンチするサークルマスクがあります。 – Knight0fDragon

+0

@ Knight0fDragon: 。私のコードはあなたが記述したものとまったく同じではありませんか?私のフルスクリーンのレイヤーはすでにalpha = 0.7です。今度は、円スプライトを子として追加します。しかし、どのように私はあなたが書いている "アルファブレンディング"を作るのですか?明らかにblendMode = .Subtractが間違っています。最後に、私のマスクに円の子を付けてシーンに追加します。修正されたコードを提供できますか? – NovumCoder

+0

いいえ、私はPC上にいるので、私はあなたに答えを書こうとします – Knight0fDragon

答えて

2

を使用している場合、それはノードの背後にあるすべてのものを切断しないです穴がそれに打ち抜いて半透明のレイヤーを作成する方法についての例である:

- (注:.subtractブレンドモードを考慮にスプライトのアルファを取ることはありませんので、あなたは、作物のノードを使用する必要があります)

self.backgroundColor = .red 


//Our transparent overlay 
let fullScreen = SKSpriteNode(color: .black, size: self.size) 
fullScreen.position = CGPoint.zero 
fullScreen.zPosition = 100 
fullScreen.alpha = 0.7 

//let's make a mask to punch circles in our shape 
let mask = SKSpriteNode(color: .white, size: self.size) 
mask.position = CGPoint.zero 
mask.zPosition = 100 
mask.alpha = 1 

let circle = SKShapeNode(circleOfRadius: 20*2) 
circle.fillColor = .white 
circle.lineWidth = 0 
circle.alpha = 1 

//let circle_mask = SKSpriteNode() 
circle.blendMode = .subtract 
mask.addChild(circle) 

//let's create the node to place on screen 
let crop = SKCropNode() 
crop.maskNode = mask 
crop.addChild(fullScreen) 

self.addChild(crop) 
+0

ありがとう。よく働く。しかし、サークルがなぜSKShapeNodeでなければならないのか説明できますか? SKFriteNodeを使用してtextureFromNodeを使ってSKTextureに変換したところ、動作が停止しました。 – NovumCoder

+0

あなたは適切にブレンドしていません、あなたはノード – Knight0fDragon

+0

のノードだけを混ぜ合わせることができます。黒い領域でアルファは基本的に0ではなく、1です。テクスチャをアルファゼロで装飾した場合、動作するはずです – Knight0fDragon

関連する問題