Swift 3: вырезать дыру в узле SKSpriteNode

Прежде всего: я знаю, что на этот вопрос уже есть много ответов, но они не помогли мне решить эту проблему.

Я программирую небольшую игру. При первом запуске есть небольшой учебник, где понемногу объясняется каждый элемент игры. На каждом этапе я хочу выделить один из этих элементов. Поэтому я поставил черный SKSpriteNode с альфа 0,9 перед элементами. Если элемент должен быть выделен, SpriteNode должен стать прозрачным в этой точке. Поэтому я создал SKCropNode и маску, как показано в моем коде ниже (я просто покажу вам основные части):

import SpriteKit

class FirstLaunch: SKScene {

    var fullScreen:SKSpriteNode!
    var mask:SKSpriteNode!
    var circle1:SKShapeNode!
    var circle2:SKShapeNode!
    var crop:SKCropNode!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(size: CGSize) {
        super.init(size: size)

        fullScreen = SKSpriteNode(color: .black, size: self.size)
        fullScreen.anchorPoint = .zero
        fullScreen.position = .zero
        fullScreen.alpha = 0.9

        mask = SKSpriteNode(color: .white, size: self.size)
        mask.anchorPoint = .zero
        mask.position = .zero
        mask.alpha = 1

        circle1 = SKShapeNode(circleOfRadius: 55)
        circle1.fillColor = .white
        circle1.lineWidth = 0
        circle1.alpha = 1
        circle1.blendMode = .subtract

        //spaceship is one of my elements, which have to be highlighted at some point
        circle1.position = spaceship.position
        mask.addChild(circle1)

        //At one point I need two highlights at the same time
        circle2 = SKShapeNode(circleOfRadius: 55)
        circle2.fillColor = .white
        circle2.lineWidth = 0
        circle2.alpha = 1
        circle2.blendMode = .subtract

        crop = SKCropNode()
        crop.maskNode = mask
        crop.addChild(fullScreen)

        addChild(crop)
    }
}

Я нашел это решение здесь: /questions/48188075/spritekit-kak-sdelat-otverstiya-v-sloe-s-pomoschyu-blendmode/48188082#48188082 Я тестировал его на разных устройствах и симуляторах. Моя проблема в том, что он отлично работает в симуляторах Xcode 8 и Xcode 9 Beta, но не на iPhone с iOS 10.3.3 и не на iPhone с iOS 11 Beta. На айфонах все приложение работало отлично, за исключением точки выделения.

Изображений:

Одна учебная точка на симуляторе

То же самое на iPhone

Можете ли вы сказать мне, почему это отличается? Я никогда не видел ничего подобного раньше.

1 ответ

У меня были такие же проблемы. Мне нужно 3 недели, чтобы это выяснить.

Установите aplha отверстия на 0,001 и режим смешивания на.replace.
Тогда это будет работать на устройстве (для меня на iOS 12).

import SpriteKit

class FirstLaunch: SKScene {

    var fullScreen:SKSpriteNode!
    var mask:SKSpriteNode!
    var circle1:SKShapeNode!
    var circle2:SKShapeNode!
    var crop:SKCropNode!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(size: CGSize) {
        super.init(size: size)

        fullScreen = SKSpriteNode(color: .black, size: self.size)
        fullScreen.anchorPoint = .zero
        fullScreen.position = .zero
        fullScreen.alpha = 0.9

        mask = SKSpriteNode(color: .white, size: self.size)
        mask.anchorPoint = .zero
        mask.position = .zero
        mask.alpha = 1

        circle1 = SKShapeNode(circleOfRadius: 55)
        circle1.fillColor = .white
        circle1.lineWidth = 0

        // Here is the required change
        circle1.alpha = 0.001
        circle1.blendMode = .replace

        //spaceship is one of my elements, which have to be highlighted at some point
        circle1.position = spaceship.position
        mask.addChild(circle1)

        crop = SKCropNode()
        crop.maskNode = mask
        crop.addChild(fullScreen)

        addChild(crop)
    }
}
Другие вопросы по тегам