2015-05-04 39 views
0

我對swift很陌生,似乎無法理解這個概念: 我需要在一個函數中創建一個SKSpriteNode,然後在另一個函數中將其刪除,並且我無法完全知道如何對其進行編碼,以便移除功能可以訪問在另一個功能中創建的元素。情況:啓動節點已創建並顯示在屏幕上。英雄收集電源並在屏幕底部添加一個圖標。然後玩家可以觸摸開機圖標來使用它,然後應該從屏幕上移除圖標。 我會盡力在下面的代碼中說明我的意思。在不同的函數中添加/刪除SKSpriteNode

func createPowerUp() { 
    var powerUpNode = SKSpriteNode("...")//add node to screen for player to collect 
    addChild(powerUpNode) 
} 

func playerCollectsPowerUp() { 
    let powerUpIcon = SKSpriteNode("...")//add icon to bottom of screen 
    addChild(powerUpIcon) 
} 

func usePowerUp() { 
    powerUpIcon.removeFromParent()//This is my error, powerUpIcon is not defined 

func touchesEnded() { 
    usePowerUp() 
} 

那麼,如何組織這個讓usePowerUp()可以訪問我在playerCollectsPowerUp創建SKSpriteNode()?我知道我可以在更高級別上定義SKSpriteNode,這樣可以使兩種方法都可以訪問加電圖標。但這是一種好的做法嗎?

回答

0

有多種方法可以做到這一點。正如你所說的,你可以在更高層次上定義變量,以使其可以訪問所有功能。你也可以在你的課程的擴展中聲明它。例如,你可以在你的文件迅速下(雖然我習慣於在Objective-C用這個,我不知道這是否是最適合你的情況下):

extension MyScene 
{ 
    var SKSpriteNode *myNode; 
} 

另一種方式得到相同的節點是使用所有SKNode的name屬性。例如,您可以通過執行powerUpNode.name = @"My Beauty"來設置名稱。在您的usePowerup函數中,您可以執行var SKSpriteNode powerUpIcon = self.childNodeWithName("My Beauty"),其中powerUpIcon現在是您之前命名的節點(請記住,如果命名其他節點,則需要使用此方法跟蹤節點名稱)。

您可以根據您的規格選擇兩種方法之一。如果你在各種其他功能中使用它,宣佈伊娃可能是一個更好的選擇。如果您描述的功能完整,那麼使用該名稱可能是更好的選擇。至於你對聲明ivars(實例變量)的做法的問題,它絕對是普遍和被接受的做法。他們有功能的原因:)

+0

您的代碼沒有任何意義:d – LinusGeffarth

+0

我才意識到他是用快捷。應該可能更新我的答案哈。 – Andriko13

+0

你使用Swift嗎?因爲這仍然看起來相當不對... – LinusGeffarth

0

目前,你創建SKSpriteNode在一個方法,使其只能訪問該方法。

有可以共享SKSpriteNode不同的方式好像回到它並調用其他方法,並把它的節點,但最簡單的將是的方法之外創建它。所以,下方喜歡你的類聲明顯示:

class myClass { 
    //declare node here 
    func doStuff() {} 
} 

希望幫助:)

+0

好的,在類中創建節點並使用函數將其添加到場景中是可接受的做法嗎?出於某種原因,我覺得這樣做很sl but,但我會努力的。謝謝。 –

+0

假設方法** A **將其添加到視圖中,那麼需要首先調用** A **以使Node出現在屏幕上。但是每次修改節點時都會保存更改。所以** A **將節點移動到y = 10。然後方法** B **將它填充到y = 10的節點上。明白我的意思嗎?哦,如果你用我的解決方案,請確保給我信貸;) – LinusGeffarth