2016-01-22 114 views
2

所以我對SpriteKit和Swift非常陌生,並且我不太瞭解節點背後的概念(或者對於這個問題,在sprite-kit中的任何東西)。我要求你向我解釋節點的概念。瞭解SpriteKit節點的概念

我更習慣於爲每個節點創建一個不同的變量實例(比如創建一個數組),這使我能夠非常明確地引用任何單個節點。然而,在sprite工具包中,這似乎並不是這種情況,因爲您只需創建一次,然後使用addChild調用它的多個實例即可。 (比我一直在做的更好......)

這有點讓我難以想象,因爲我主要不明白我如何測試一個場景或者其他東西,或者單獨引用它們。例如,我試圖得到一個對象從現場移除與removeFromParent(),但我不如何實現這樣的:

if(enemy.position.x == 0) 
{ 
SKAction.removeFromParent() 
} 

之前,我會爲循環設置一個,檢查每一個敵人但這是超效率的。我想我會在物理引擎提供的更新方法中做到這一點,但就像我說我不知道​​如何調用它。

所以我的問題基本上是讓你向我解釋這裏發生了什麼的概念。假裝我完全不瞭解這類編程知識(我幾乎不知道這一點),如果你能把它分解給我,就像我五歲那樣會很棒:D!

謝謝!

+2

SO不是教程網站,它是一個特定問題和答案的網站,如果你想了解SpriteKit,我建議你看看http://www.raywenderlich.com/ – Knight0fDragon

+0

@ KnightOfDragon - 我無法反駁更多。 SO是這種性質問題的理想場所。這裏有大量的編碼員願意傳授他們的知識。 SO需要以主要方式減倉。 – zeeple

+0

本質上,你不必跟蹤每個節點(在一個數組等),因爲當一個節點涉及到一些有趣的事情(碰撞,觸及某事,某人用手指觸摸它等)時,你的代碼將被傳遞涉及有趣事件的節點。對於'enemy.position.x == 0'示例,可以使用enumerateChildNodeswithName來檢查每個節點的位置;或者你可以設置一個碰撞檢測的邊界,並在敵人到達那個位置時得到通知。或者你可以繼承敵人,讓所有的敵人檢查自己的位置等等 –

回答

2

我第一次學習SpriteKit時,遇到了類似的麻煩,它來自於使用UI *對象。

讓每一個節點的場景

self.children 

或者您也可以通過//*enumerateChildNodesWithName:

爲了得到一個特定節點you can reference it by name.

self.childNodeWithName("myNode") 

要在觸摸位置獲得一個節點

的Objective-C

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 
    SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:positionInScene]; 
} 

斯威夫特

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 

    for touch: AnyObject in touches { 
     let location = (touch as UITouch).locationInNode(self) 
     if let touchedNode = self.nodeAtPoint(location) { 
      // Do something with node here. 
     } 
    } 
} 

我幾乎總是給一個名稱,我的節點,因爲它使他們更容易跟...共事。 這也是您在使用.sks文件設計場景時真正與之互動的唯一方法。

什麼幫助我看着Apples DemoBots示例項目上的按鈕實現。

+0

你有沒有關於海量數量節點的建議?例如,我產生了無數的敵人,但需要檢查他們是否正在擊中屏幕的某些部分。對此有何建議? – MarshallD

+0

如果你知道這些位置,所有你需要做的就是使用像這樣的東西self.scene.nodesAtPoint(位置) –

+0

這個想法是,當一個精靈確實擊中'屏幕的某些部分'時,你的代碼被通知接觸並且還涉及到哪個精靈。 –