我创建了一个没有纹理但颜色为
的SKSPriteNodelet 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
答案 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
这个枚举的优点是,如果你需要在背景层和前景层之间添加一个新层,你根本不需要打扰这些值,只需要在两个案例之间的枚举中输入一个条目。