2016-11-28 12 views
0

私はゲームを書いています。物理的なボディが見えるようになっていても、衝突が検出されません。セットアップするには、物理​​学の世界をゲームシーンにサブクラス化されたノードで衝突が検出されない

、私はクラス宣言の上に次のようにコード化されました:

struct PhysicsCategory { 
    static let None: UInt32 = 0 
    static let Chicken: UInt32 = 0b1 
    static let Edge: UInt32 = 0b10 
} 

その後、シーンの実際のクラス内:

override func didMove(to view: SKView) { 
    setupNodes() 
    setupTrial() 

    let playableRect = CGRect(x: 0, y: 0, width: size.width/2, height: size.height/2) 
    self.physicsBody = SKPhysicsBody(edgeLoopFrom: playableRect) 
    self.physicsWorld.contactDelegate = self 
    self.physicsBody!.categoryBitMask = PhysicsCategory.Edge 
    self.physicsBody!.contactTestBitMask = PhysicsCategory.Chicken 

    // This is important for handling all the custom events 
    enumerateChildNodes(withName: "//*", using: { node, _ in 
     // we need to limit this to chickens only 
     if let customNode = node as? CustomNodeEvents { 
      customNode.didMoveToScene() 
     } 
    }) 
} 
ここ

は、衝突を検出するためのコードです:私はアニメーション化したい

func didBegin(_ contact: SKPhysicsContact) { 
    print("something happened") 
    let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    if collision == PhysicsCategory.Chicken | PhysicsCategory.Edge { 
     print("it works!") 
    } 
} 

ノードは鶏です。私はゲームが上記の世界の端に衝突したときにそれを検出したい。

私の鶏のサブクラスは、このです:

class TargetNode: SKSpriteNode, CustomNodeEvents, InteractiveNode { 

func didMoveToScene() { 
    isUserInteractionEnabled = true 

    anchorPoint = CGPoint(x: 0, y: 0) 
    let playableRect = CGRect(x: self.anchorPoint.x, y: self.anchorPoint.y, width: self.size.width, height: self.size.height) 

    physicsBody = SKPhysicsBody(edgeLoopFrom: playableRect) 
    physicsBody!.isDynamic = true 
    physicsBody!.categoryBitMask = PhysicsCategory.Chicken 
    physicsBody!.contactTestBitMask = PhysicsCategory.Edge | PhysicsCategory.Chicken 
    physicsBody!.velocity = CGVector(dx: 100, dy: 0) 
} 
} 

EDIT:ノードはゲームシーンファイル内でこのメソッドを使用してシーンに追加されています。

func generateItems(targetNumber: Int, target: Bool) { 
    let movingItems = true 
    for _ in 0...(targetNumber - 1) { 
     if (target) { 
      let name = createTarget() 
      let targetNode = TargetNode(imageNamed: name) 
      targetNode.name = name 
      fgNode.addChild(targetNode) 
      targetNode.position = generateRandomLocation() 
      //if movingItems { animateTargets(targetNode) } 
     } 
} 
+0

と接触した場合、衝突をチェック! –

+0

私は上記の編集で追加された関数を使ってたくさんのノードを生成しています。 – illuminatedtype

+0

エッジとヒヨコの両方が物理を持っていると思っています。エッジループから構築されたボディ。私はこれらが衝突するとは思わない。 –

答えて

1

チキンをSKPhysicsBody(edgeLoopFrom :_)に設定することは悪い考えです。代わりにSKPhysicsBody(rectangleOf :_)に鶏の周りに矩形を描こうとすると、描画する図形のタイプが異なる場合があります。詳しくは、ドキュメントをチェックしてください。また鶏を乗り切るチェックする

playableRect

と接触してきた私たちはRECTは、我々は鶏と接触したかどうかを知りたい鶏に接触したかどうかを確認したくないので、self.physicsBody!.contactTestBitMask = PhysicsCategory.Chickenを削除再生可能なRect。だからcontactTestBitMaskを鶏肉に保管してください。

除外:あなたの鶏のサブクラスから、天気をチェックしたい場合を除き、ニワトリはお互いに衝突します。最後に

:鶏はあなたがシーンにノードを追加しているplayableRect

func didBegin(_ contact: SKPhysicsContact) { 

    if contact.bodyA.categoryBitMask == PhysicsCategory.Chicken && contact.bodyB.categoryBitMask == PhysicsCategory.Edge { 
     print("Chickens have collided with edge") 
    } 

    } 
+0

ありがとうございます。奇妙なことから、なぜSKPhysicsBodyの形状を変更すると何が変わるのですか? – illuminatedtype

+1

これは、Edge Based Physicsボディが他のエッジベースボディと対話できないためです。私は親指を得ることができますか? :) –

関連する問題