SpriteKit:如何使用blendMode

时间:2016-11-20 02:02:29

标签: swift sprite-kit mask

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

现在我希望专注于一个带有蒙版的特定元素,并在与我想要关注的元素相同的位置剪切整体。非常类似于我们在某些游戏首次展示某种教程时可以看到的内容。

基本上我正在使用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

1 个答案:

答案 0 :(得分:3)

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

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

app.post('/signup', function(request, response){

        console.log(request.body.email);
        console.log(request.body.password);

        User
        .find({ where: { name: request.body.email } })
            .then(function(err, user) {
                if (!user) {
                        console.log('No user has been found.');

                        User.create({ name: request.body.email }).then(function(user) {
                            // you can now access the newly created task via the variable task
                            console.log('success');
                        }).catch(function(error) {
                            console.log(error);
                        });

                } 
            });



    });