2016-06-20 3 views
0

私はCellと呼ばれるSKNodeのサブクラスを持っています。私はすべての物理学の体を設定し、彼らは適切に衝突する。ただし、didBeginContact()関数はGameSceneにあり、セルプロパティを変更するセルで宣言された関数を呼び出したいので、Cellにする必要があります。デリゲートをSKNodeサブクラスに設定する方法はありますか?あるいは、回避策を使ってGameSceneのCell内の関数を呼び出すことはできますか?物理体細胞の内側SKNodeサブクラス内でSK物理接点をテストするにはどうすればよいですか?

let cellCategory: UInt32 = 0x1 << 0 
let foodCategory: UInt32 = 0x1 << 1 
let borderCategory: UInt32 = 0x1 << 2 

、セットアップ:

let physicsBody = SKPhysicsBody(circleOfRadius: 5) 
self.physicsBody = physicsBody 
self.physicsBody!.affectedByGravity = false 
self.physicsBody!.allowsRotation = false 
self.physicsBody!.categoryBitMask = cellCategory 
self.name = "cell" 
self.physicsBody!.contactTestBitMask = cellCategory | borderCategory 

も注意:以下の答えが正しい:私はスウィフト3.0

EDITを使用していますビットマスクを設定

。みんなにヘッドアップ:

func didBeginContact(contact: SKPhysicsContact) { 
    ... 
} 

キープスウィフト3.0

+0

共有コードを助けるかもしれません! – dip

+0

申し訳ありません。私は今実際に自分のコンピュータにアクセスすることはできません。私はこれがすべての必要な詳細をカバーしていると思いますが、もし下の解決策がそれを修正しなければ、私はコードを明日共有することができます@dip –

答えて

0

のよう

func didBegin(_ contact: SKPhysicsContact) { 
    ... 
} 

に名前が変更されましたあなた、それがどこにあるか(あるいは、少なくともセルにそれを移動しないでください)didBeginContact 。何がしたいことは、あなたのクラスCellにノードにキャストすることで、その要旨は次のようなものでしょう:

func didBeginContact(contact: SKPhysicsContact) { 
    if let cell = contact.bodyA.node as? Cell { 
     cell.someFunctionThatBelongsToThisClass()   
    } else if let cell = contact.bodyB as? Cell { 
     cell.someFunctionThatBelongsToThisClass()   
    } 
... 

上記はかなり厄介になり、確実にリファクタリングする必要があり、それが取得するお手伝いをしなければなりません道....

ややクリーナー多分に:

let cell: Cell? = contactBodyA.node as? Cell ?? contactBodyB.node as? Cell 
cell?.someFunction() 
+0

私は朝にそれを試します。 「乱雑」とはどういう意味ですか? –

+0

ちょうどそれは_look_特に素敵ではありません。 –

+0

それが効果的に仕事を成し遂げている限り、私はそれに耐えることができます。ありがとう。 –

関連する問題