带有颜色的SKSpriteNode不显示

时间:2014-12-01 14:09:29

标签: ios swift sprite-kit 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

2 个答案:

答案 0 :(得分:1)

我相信您使用Xcode中的Game项目模板创建了项目,对吗?你的问题是GameViewController.m中的这一行(大致是第41行)。

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

如果您将其设置为NO,那么它将按预期呈现。我从空项目构建我的游戏项目,所以我从来没有设置过该属性。只需搜索代码ignoresSiblingOrder

即可

当然,如果您想要进行渲染优化,那么您始终可以使用zPosition。

答案 1 :(得分:0)

我注意到,使用纹理创建SKSpriteNode和使用颜色创建SKSpriteNode之间的区别在于纹理版本不需要修改其z-index。它会自动显示在之前的addChild(someNodes)上。

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

这一行应该可以解决问题:

tileNode.zPosition = 1 //Or higher

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

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

并像这样使用它:

tileNode.zPosition = ZLayer.Background.rawValue

这个枚举的优点是,如果你需要在背景层和前景层之间添加一个新层,你根本不需要打扰这些值,只需要在两个案例之间的枚举中输入一个条目。