2014-10-03 71 views
5

使用Swift和SpriteKit時,SKSpriteNode在將其作爲子項添加到另一個SKSpriteNode時沒有顯示出問題。相比之下,放在完全相同位置的SKLabelNode顯示出來。SKSpriteNode隱藏在父節點下面

// does not show up, expected a white square 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 48, height: 48)) 
    node.position = position 
    parentNode.addChild(node) 
} 

// does show up as white text in the correct position 
override func renderBody(parentNode: SKNode, position: CGPoint) { 
    let node = SKLabelNode(text: "hello") 
    node.position = position 
    parentNode.addChild(node) 
} 

'parentNode'和'position'在兩種情況下都是相同的。

'parentNode'是一個較大的SKSpriteNode,用深色的紋理創建,覆蓋屏幕作爲背景。

'position'是CGPoint(x:50,y:50)。

它看起來像矩形精靈獲取低於背景,而標籤精靈頂部。我嘗試刪除背景並將矩形精靈直接添加到場景節點,然後顯示出來。

有沒有人有什麼可能是錯的想法?

編輯:設置zPosition手動解決問題。不過,我仍然認爲在某個地方出了問題。您不需要在子節點上手動設置它,以避免其父節點隱藏子節點。我從來不需要在Xcode 5中執行此操作。爲什麼labelnode和sprite節點之間存在差異?

下面是一個希望更好地說明它的例子。在Xcode 6中創建一個默認的SpriteKit,Swift,Iphone項目。將下面的代碼粘貼到touchesBegan的for-loop中。刪除在didMoveToView中創建的「Hello World」標籤。運行它並單擊屏幕中間的某個位置。

let location = touch.locationInNode(self) 

// LabelNode without manually setting zposition 
// visible 
let backGround1 = SKSpriteNode(imageNamed:"Spaceship") 
backGround1.position = CGPoint(x: location.x, y: location.y + 250) 
backGround1.xScale = 0.5 
backGround1.yScale = 0.5 
self.addChild(backGround1) 
let labelNode = SKLabelNode(fontNamed: "ChalkDuster") 
labelNode.text = "I am on top" 
labelNode.fontSize = 48 
labelNode.fontColor = UIColor.yellowColor() 
backGround1.addChild(labelNode) 

// SpriteNode without manually setting zposition 
// hidden under its parent node 
let backGround2 = SKSpriteNode(imageNamed:"Spaceship") 
backGround2.position = location 
backGround2.xScale = 0.5 
backGround2.yScale = 0.5 
self.addChild(backGround2) 
let spriteNode2 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
backGround2.addChild(spriteNode2) 

// SpriteNode with zposition manually set 
// visible 
let backGround3 = SKSpriteNode(imageNamed:"Spaceship") 
backGround3.position = CGPoint(x: location.x, y: location.y - 250) 
backGround3.xScale = 0.5 
backGround3.yScale = 0.5 
self.addChild(backGround3) 
let spriteNode3 = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 100, height: 100)) 
spriteNode3.zPosition = 0.001 
backGround3.addChild(spriteNode3) 
+2

zPosition屬性控制繪製節點的順序。具有最高值的節點將位於頂部。默認值爲0. – 0x141E 2014-10-03 05:43:19

+0

感謝您的回答!是的,將zPosition設置爲正值可以解決問題。但我對這個解決方案並不滿意。請參閱我編輯問題的解釋。我認爲添加一個zPosition = 0的孩子應該自動將它放在父代的頂部。 – uaknight 2014-10-03 17:34:10

回答

9

什麼你要找的是ignoresSiblingOrder財產上SKView

一個布爾值,指示父子和兄弟姐妹是否 關係影響場景節點的渲染次序。

默認的Xcode 6.x的(也許5,我沒有檢查)SpriteKit模板設置,爲true建立在視圖控制器的SKView時。將它設置爲true,將節點添加到場景中的順序不會影響它們的z位置。如果將其設置爲false,則會按照將它們添加到場景(或父節點)的順序進行分層。

這就是說,當ignoresSiblingOrdertrue(這就是爲什麼這是模板中的默認值)時,SpritKit可以做一些優化,因此如果可能的話最好保持這種方式。在這種情況下,您必須手動設置每個節點的zPosition屬性。