シンプルなシーンをいくつか追加しました。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
サークルマスクに円を追加することはありません。テクスチャ、それは何にも溶けない。サークルマスクを完全なブラックボックスにします。子として円を追加します。アルファブレンディングが入り込んで穴を作ります。また、マスキングはアルファレベルでは機能しません。単にオン/オフしているので、透明なテクスチャを通常のテクスチャとして追加する必要があります。穴をパンチするサークルマスクがあります。 – Knight0fDragon
@ Knight0fDragon: 。私のコードはあなたが記述したものとまったく同じではありませんか?私のフルスクリーンのレイヤーはすでにalpha = 0.7です。今度は、円スプライトを子として追加します。しかし、どのように私はあなたが書いている "アルファブレンディング"を作るのですか?明らかにblendMode = .Subtractが間違っています。最後に、私のマスクに円の子を付けてシーンに追加します。修正されたコードを提供できますか? – NovumCoder
いいえ、私はPC上にいるので、私はあなたに答えを書こうとします – Knight0fDragon