我创建了一个没有纹理但颜色的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 种情况之间的枚举中输入一个条目即可。