2016-01-18 42 views
0

我正在重新使用DemoBots中用於接觸檢測的方法。由於我的代碼的工作方式和如何編寫DemoBots之間的差異,我遇到了一個問題。 在DemoBots,組件RenderComponent具有可變「nodeGKEntity not identified

let node = EntityNode() 

init(entity: GKEntity) { 
    node.entity = entity 
} 

在我的代碼,我沒有使用動畫,所以我相當於RenderComponent的是更復雜一點。變量「節點」已被使用,並綁在physicsBody,所以我創建了一個新的變量「entityNode

let node: SKSpriteNode 
let entityNode = EntityNode() 

init(entity: GKEntity, nodeTemplate: SKSpriteNode) { 
    node = SKSpriteNode(imageNamed: "animal") 
    entityNode.entity = entity 
} 

內handleContact:方法,我嘗試了兩種解決方案,以獲得參考實體。 選項1:

let entityA = (contact.bodyA.node as? EntityNode)?.entity 
let entityB = (contact.bodyB.node as? EntityNode)?.entity 

運行的print()檢查這個返回這兩個實體一個零值。這是合乎邏輯的,因爲我應該尋找名爲'entityNode'的屬性來查找實體。當我將其更改爲 選項2:

let entityA = (contact.bodyA.entityNode as? EntityNode)?.entity 
let entityB = (contact.bodyB.entityNode as? EntityNode)?.entity 

我得到一個錯誤的physicsBody沒有一個成員「entityNode」。我嘗試了一些其他的東西,比如查找與contactBody相關聯的實體,但是我得到了另一個錯誤,說明後續代碼正在尋找可選項。我試圖擺脫'如果',但它只是將問題一起移動到下一個contactCallBack電話。

if let notifiableEntity = entityA as? ContactNotifiableType, otherEntity = entityB where aWantsCallback { 
    contactCallback(notifiableEntity, otherEntity) 
} 

任何想法如何,我可以解決這個得到contactCallBack電話的工作?

回答

-1

我最近遇到了類似的問題 - 確保您的iOS版本爲> = 9和OSX至少10.11

0

選項1應正常工作,如果碰撞節點(S)是/是具有實體組件的一個EntityNode類型的節點。 您創建一個EntityNode類

class EntityNode: SKSpriteNode { 
    weak var entity: GKEntity! 
} 

你RenderComponent應該是這樣的:

class RenderComponent: GKComponent{ 

let node: EntityNode 

init(entity:GKEntity, ......) { 
    node = EntityNode(texture: texture, color: SKColor.whiteColor(), size: size) 
    node.physicsBody = SKPhysicsBody(rectangleOfSize: aCGSize, center: aCGPoint) 

    node.physicsBosy.categoryBitMask = PhysicsCat.Enemy 
} 

點的初始化使用EntityNode,但你喜歡SKSpriteNode的任何初始化。

最後,contactCallBack 「didBeginContact或didEndContact」 中,您將選項1工作如果contact.body(A或B).categoryBitMask是=到PhysicsCat.Enemy

是這樣的:

if (contact.bodyA.categoryBitMask == PhysicsCat.Enamy || contact.bodyB.categoryBitMask == PhysicsCat.Enamy) { 
    let entityA = (contact.bodyA.node as? EntityNode)?.entity 
    let entityB = (contact.bodyB.node as? EntityNode)?.entity 
    ... 
} 

您的選項2將永遠不會工作,因爲contact.bodyA和bodyB都具有SKNode類型的屬性節點,您必須首先將其強制轉換爲EntityNode,如選項1