SpriteKit 背景 PNG,Alpha 显示黑色

SpriteKit Backdrop PNG with Alpha showing black

我有一个 Spritekit 游戏是在 Swift 制作的,当游戏结束时,我有一个背景是一个 png 文件,其 alpha 值为 0.5ish(所以它透视)。我是用 photoshop 做的。

我用它来淡化游戏细节并将记分卡放在它上面。

当我在我的 iPhone 6 plus 运行ning iOS 9.2 上使用它时,效果很好,使细节变暗并显示记分卡...但是当我 运行 它在模拟器 运行ning iOS 9.2 或 iPhone 5C 运行ning iOS 8.4 上,它只是显示黑色...覆盖整个游戏屏幕...

声明如下:

    //alpha'sd png created in photoshop. approx. 0.3 alpha
    let backdrop = SKSpriteNode(imageNamed: "Background_Alpha") 

    backdrop.anchorPoint = CGPoint(x: 0.5, y: 1.0)
    backdrop.position = CGPoint(x: size.width/2, y: size.height)
    backdrop.name = "ScoreScreen"
    backdrop.zPosition = Layer.UIBackground.rawValue
    worldNode.addChild(backdrop)

并这样调用:

    backdrop.alpha = 0
    let drop = SKAction.fadeInWithDuration(kAnimDelay)
    drop.timingMode = .EaseInEaseOut
    backdrop.runAction(SKAction.sequence([
        SKAction.waitForDuration(kAnimDelay),
        drop
        ]))

这是模拟器的屏幕截图...但正如我提到的,它也发生在我的 iPhone 5C with 8.4...

黑色应该是透明的蓝光,让玩家仍然可以看到背景中的游戏,但不是那么生动...

知道为什么吗?

所以 this question 的答案是:

According to the documentation here:

Sprite Kit works only with solid colors. For best results, use the preset colors provided by the platform class or a custom color defined in the RGBA device color space

这是否仍然正确,我不知道,但我没有使用 alpha'd png 而是使用 Spritekit 从头开始​​创建它并按如下方式调用它:

    let backdrop = SKSpriteNode(color: 
                          SKColor(red: 29.0/255.0, 
                                green: 113.0/255.0, 
                                 blue: 149.0/255.0, 
                                alpha: 0.3),         //set alpha here
                                 size: size)

    backdrop.position = CGPoint(x: size.width/2, y: size.height/2)
    backdrop.name = "ScoreScreen"
    backdrop.zPosition = Layer.UIBackground.rawValue
    worldNode.addChild(backdrop)                     //add it to world

    //because I set the alpha in the SKSpriteNode,
    //I can still animate it in from alpha=0 to alpha=0.3:

    backdrop.alpha = 0
    let drop = SKAction.fadeInWithDuration(kAnimDelay)
    drop.timingMode = .EaseInEaseOut
    backdrop.runAction(SKAction.sequence([
        SKAction.waitForDuration(kAnimDelay),
        drop
        ]))

这现在可以工作,并在游戏结束屏幕上显示整个游戏的透明精灵到沉闷的场景。由于项目不再需要存储整个 png 图像,因此效率也更高。

我仍然很想知道为什么它不能像我原来那样工作,但这至少是一个解决方案。