Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift SpriteKit:如何使用blendMode在图层上打洞_Swift_Sprite Kit_Mask - Fatal编程技术网

Swift SpriteKit:如何使用blendMode在图层上打洞

Swift SpriteKit:如何使用blendMode在图层上打洞,swift,sprite-kit,mask,Swift,Sprite Kit,Mask,我有一个简单的场景,添加了一些元素 现在我想把焦点放在一个特定的元素上,用一个遮罩,在我想聚焦的元素的相同位置切割一个整体。非常类似于我们在一些游戏上看到的,当它们第一次开始展示某种教程时 基本上,我添加了一个带有alpha=0.7的全屏层(因此用户仍然可以看到所有内容),但随后在一个特定位置添加一个圆圈,作为该层的子层,并设置blendMode=。减法,所以它从这个全屏图层上“剪切”出一个圆,这样在这个圆内你就可以清楚地看到 在我将所有元素添加到屏幕上之后,我有以下代码 // before t

我有一个简单的场景,添加了一些元素

现在我想把焦点放在一个特定的元素上,用一个遮罩,在我想聚焦的元素的相同位置切割一个整体。非常类似于我们在一些游戏上看到的,当它们第一次开始展示某种教程时

基本上,我添加了一个带有
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)
但这只是增加了全屏层,没有圆孔。看起来它正在忽略圆形遮罩节点。我做错了什么

我的计划是继续移动圆形遮罩,以聚焦该场景中的其他元素。据我所知。Subtract它应该只从其父节点减去,父节点是全屏层,alpa=0.7,对吗

我刚试过SKCropNode。将全屏层作为子层添加到裁剪节点中,然后将圆指定为遮罩。但现在,它几乎删除了所有内容,只是显示了我的全屏图层的一个圆圈,我实际上需要这个裁剪节点的反转结果


blendMode的问题是在最终的帧缓冲区上运行它,但我需要的是仅在父节点上运行它,这样在使用时它不会剪切节点后面的所有内容。Subtract

下面是一个如何创建带有穿孔的半透明层的示例:

-(注意:。减法混合模式不考虑精灵的alpha,因此需要使用裁剪节点)


你们从来并没有添加圆到圆的遮罩,你们只是把它作为一个纹理,它并没有混合到任何东西。使圆形遮罩成为完整的黑框。并作为子对象添加圆。Alpha混合将开始并创建洞。此外,遮罩在alpha级别不起作用,它只是打开和关闭,因此您需要添加透明纹理作为正常纹理,然后使用圆遮罩来打孔hole@Knight0fDragon例如我不明白。我的代码不是和你描述的一样吗?我的全屏图层的alpha=0.7。现在我将圆形精灵添加为子对象。但我如何制作你所写的“阿尔法混合”。显然blendMode=.Subtract是错误的。在最后,我添加了我的面具与圈孩子到场景中。你能提供一些正确的代码吗?不,不是,现在我在一台电脑上,我会试着为你写一个答案。谢谢。效果很好。但是你能解释为什么这个圆必须是SKShapeNode吗?我使用SKSpriteNode将其转换为带有textureFromNode的SKTexture,这使其停止工作。您没有正确混合,只能在节点上混合节点基本上黑色区域中的alpha不是0,而是1。如果你用alpha-zero来伪装你的纹理,它应该work@Knight0fDragon:知道cropNode在ios 10上的工作原理吗?尝试使用blendMode和掩蔽,但仍无法使用10.x IOS将孔的alpha设置为0.001,将blendMode设置为.replace。
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)