带有颜色的 SKSpriteNode 不显示



我创建了一个没有纹理但颜色的SKSPriteNode

let tileNode = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 80.0, height: 120.0))
tileNode.position = CGPointMake(50, 50)
tileNode.name = "rectangle"
addChild(tileNode)

但节点不会显示在屏幕上。

但是,我可以通过触摸碰撞检测到它

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    let location: CGPoint = (touches.anyObject() as UITouch).locationInNode(tilesLayer)
    let rect: SKSpriteNode = tilesLayer.childNodeWithName("rectangle") as SKSpriteNode
    if rect.containsPoint(location) {
        println("TOUCHED")    //It works
    }
}

编辑:SKSpriteNode颜色仅在存在背景SKSpriteNode纹理时才隐藏。完整代码:https://gist.github.com/BabyAzerty/9dca752d9faa7b768bf0

我相信

您使用 Xcode 中的游戏项目模板创建了项目,对吗?您的问题是 GameViewController.m 中的这一行(大约第 41 行)。

/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;

如果将其设置为 NO,则它将按预期呈现。我从空项目构建游戏项目,因此从未设置过该属性。只需搜索您的代码即可ignoresSiblingOrder

当然,如果你想要渲染优化,那么你总是可以使用zPosition。

我注意到创建带有纹理的 SKSpriteNode 和带有颜色的 SKSpriteNode 之间的区别在于纹理版本不需要修改其 z 索引。它将自动显示在上一个addChild(someNodes)上。

它们的默认 z 索引均为 0,但由于某些原因,带有颜色的 SKSpriteNode 隐藏在之前的 addChild(someNodes) 后面。

这条线应该可以解决问题:

tileNode.zPosition = 1 //Or higher

但是,我决定创建一个控制不同 z 图层的枚举(就像 Unity 引擎中的枚举一样):

enum ZLayer: CGFloat {
    case Undefined = 0
    case Background
    case Foreground
    case GUI
}

并像这样使用它:

tileNode.zPosition = ZLayer.Background.rawValue

这个枚举的优点是,如果需要在背景层和前景层之间添加新层,则根本不需要为值而烦恼,只需在 2 种情况之间的枚举中输入一个条目即可。

最新更新