2015-06-20 77 views
0

在我的項目中,我使用名爲RocketMaker的類創建了新節點。這個類裏面,我有一個名爲applyRecurringForce()功能...展開SKPhysicsBody不起作用

func applyRecurringForce() { 
    var thrust: CGVector = CGVectorMake(100, 100) 
    physicsBody!.applyForce(thrust) 
} 

我的問題是我無法從主場景中訪問該功能。

override func update(currentTime: NSTimeInterval) { 
    /* Called before each frame is rendered */ 
    for rocketNode in rocketShips.children { 
     println("physicsBody: \(rocketNode.physicsBody.description)") 
     rocketNode.physicsBody.applyRecurringForce() 
    } 
} 

與上面的代碼開始,我得到兩個錯誤,一個是println,以及一個用於調用applyRecurringForce()

方法1:沒有強制展開...
1)中的println錯誤是「可選類型‘SKPhysiceBody’沒有解開的價值,你的意思是使用‘!’要麼 '?'?」並提出了我力量展開
2)調用返回「無法調用‘applyRecurringForce’不帶參數的」

Approach2:「」我加遵循建議的解決方案...
1)println錯誤與先前方法「:」可選類型'SKPhysiceBody'的值未解包;你的意思是使用'!' 「?」?還是」和它再次提出我強迫展開
2)調用返回相同的錯誤前面:‘不能援引‘applyRecurringForce’不帶參數的’

Approach3:所以我跟着鏈,這兩個錯誤中的一個被刪除...
1)println錯誤消失
2)該調用返回「'SKPhysicsBody沒有名爲'applyRecurringForce'的成員「

如果我將電話註釋掉了,我會得到

physicsNodeName:類型:representedObject:[名稱: 'rocket1' 位置:{56,294} accumulatedFrame:{{16.849998474121094,280.20001220703125},{78.300003051757812,27.5999755859375}}]

沒有人有一個想法這是怎麼回事??這個雙解開看起來很奇怪。

回答

0

那麼您的applyRecurringForce方法是在您的自定義節點類(RocketMaker)中聲明的,而不是SKPhysicsBody類。所以,你需要你的for循環的內部改成這樣:

println("physicsBody: \(rocketNode.physicsBody!.description)") 
rocketNode.applyRecurringForce() 

此外,我真的不知道什麼是rocketShips。我最初雖然這是一個數組,但鑑於您正在訪問children屬性,我將假定它是某種SKNode。通常你不想命名單個節點的複數。

假設rocketShips是一個節點,那麼你需要它的孩子們投射到您的自定義節點類,因爲在默認情況下childrenAnyObject數組(這就是爲什麼你看到雙解包)。請參閱以下全面解決方案。請注意,雖然我正在鑄造整個children陣列。如果您的陣列包含RocketMaster節點和其他節點的組合,則需要分別投射每個孩子。

import SpriteKit 
class GameScene: SKScene { 
    var rocketShips: SKNode! //var rocketShips: [RocketMaster] = [] 
    override func update(currentTime: NSTimeInterval) { 
     /* Called before each frame is rendered */ 
     for rocketNode in rocketShips.children as! [RocketMaster] { 
      println("physicsBody: \(rocketNode.physicsBody!.description)") 
      rocketNode.applyRecurringForce() 
     } 
    } 
} 

class RocketMaster: SKNode { 
    func applyRecurringForce() { 
     var thrust: CGVector = CGVectorMake(100, 100) 
     physicsBody!.applyForce(thrust) 
    } 
} 
+0

謝謝加載!你說得對,rocketShips是一個SKNode。它的孩子建立在自定義節點類(不同顏色的火箭級別)中。我也嘗試過rocketNode.applyRecurringForce(),但被錯誤「AnyObject沒有名爲'applyRecurringForce()''的成員阻止。將RocketShip兒童投入RocketMaster解決了問題! –

+0

@ ShaneO'Seasnain如果您覺得問題已解決,請將我的答案標記爲已接受。祝你好運。 –