2016-03-26 4 views
1

これを行う方法については、インターネット上で何も見つかりませんでした。物理的なボディタッチにコードの行を実行しようとしているだけです。この場合、私は物理学のボディと地面のSKSpriteNodeを持っています。彼らが触れると、コードの行を実行する必要がありますこれはこれまで私が見つけたすべてです。SpriteKitで2つのオブジェクトが接触したときを検出する方法

let catGroup:UInt32 = 0x1 << 0 
let groundGroup:UInt32 = 0x2 << 1 
    cat.physicsBody?.categoryBitMask = catGroup 
    cat.physicsBody?.contactTestBitMask = groundGroup 
    ground.physicsBody?.categoryBitMask = groundGroup 
    ground.physicsBody?.contactTestBitMask = catGroup 

と、ここで私は

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } 
    else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if firstBody.categoryBitMask==0 && secondBody.categoryBitMask==1 { 
     print("contact") 
    } 

} 

はので、私はcatGroupとgroundGroupで第1の本体と第2のボディを交換する必要があり混乱しているどこにあるのでしょうか?わからないわよ

+0

可能な複製を助け[初心者迅速スプライトキット - ノードの衝突検出ヘルプ(SKPhysicsContact)](http://stackoverflow.com/questions/26270504/beginner-swift-sprite-kit -node-collision-detection-help-skphysicscontact) –

+0

didBeginContactを持っているクラスを設定しましたか?Physivs Contact Delegateプロトコルを持っていて、「代理人」プロパティを設定しましたか?それを行った後で、あなたのdudBeginContactにprint( "接触が検出されました")を入れて、呼び出されているかどうか(より適切にはブレークポイントを設定するかどうか)を確認します。 –

+0

firstBodyとsecondBodyを置き換えることはできません。categoryBitMasksを調べて、どちらが猫で、どちらが地面であるかを調べる必要があります。 –

答えて

1

私は大声ではありませんが、「インターネット上で何かを見つけることができませんでした」との質問をするべきではありません。 SpriteKitの基本の1つとして、衝突検出に関する100万本のチュートリアルがあります。

今すぐご質問ください。あなたはあなたのスプライトに実際の物理学のボディを与えておらず、あなたの物理のカテゴリは変わっています。あなたのオブジェクトがデフォルトでオンになっている、重力をオフにする必要が下落したくない場合は、この

struct PhysicsCategory { 
     static let cat:UInt32 = 0x1 << 0 
     static let ground:UInt32 = 0x1 << 1 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 


    override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

     physicsWorld.contactDelegate = self 


     cat.physicsBody = SKPhysicsBody(rectangleOfSize: cat.size) // FORGOT THIS 
     cat.physicsBody?.categoryBitMask = PhysicsCategory.cat 
     cat.physicsBody?.contactTestBitMask = PhysicsCategory.ground 

     ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size) // FORGOT THIS 
     ground.physicsBody?.categoryBitMask = PhysicsCategory.ground 
     ground.physicsBody?.contactTestBitMask = PhysicsCategory.cat // You dont really need this line as long as you have set it on the other body. 
    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     var firstBody: SKPhysicsBody 
     var secondBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 
      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 

     if firstBody.categoryBitMask == PhysicsCategory.cat && secondBody.categoryBitMask == PhysicsCategory.ground { 
      print("contact") 
     } 
    } 
} 

にあなたのコードを変更します。

cat.physicsBody?.affectedByGravity = false 
ground.physicsBody?.affectedByGravity = false 

ホープこれはの

+0

助けていただきありがとうございますが、これを試しても機能しませんでした。 –

+0

私は申し訳ありませんが物理的なカテゴリの構造体に1つのわずかなエラーがあった、静的なletされている必要があります。読みやすいように全回答を更新しました。それがどうなるか教えてください – crashoverride777

関連する問題