[SceneKit專題]13-Intermediate-Collision-Detection碰撞檢測中級

說明

本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會node

此書對應的代碼地址git

SceneKit系列文章目錄github

在迷宮類遊戲中,小球須要和不一樣物體碰撞,和不一樣物體碰撞後又會有不一樣結果swift

QQ20170416-105051@2x.png

bit masks位掩碼

就是二進制的值,能夠用來作位運算,運算結果爲0表示關,運算結果爲其它值表示開 app

QQ20170412-223058@2x.png

Category masks分類掩碼

用二進制數來表明不一樣物體的分類 post

QQ20170416-103707@2x.png

Collision masks碰撞掩碼

表示本身能和哪些類別物體碰撞,如BALL(球)的值14=8+4+2,表明能夠和2(STONE石頭),4(PILLAR柱子),8(CRATE木箱)三類物體碰撞.而其餘值都是1,表明只能夠和1(BALL球)碰撞 學習

QQ20170416-103745@2x.png

Contact masks接觸掩碼

表示和哪些物體碰撞時要觸發代理事件.如BALL(球)的值14=8+4+2,表明和2(STONE石頭),4(PILLAR柱子),8(CRATE木箱)三類物體碰撞時調用代理方法.而其餘值都是0,表明碰撞時不通知代理.physicsWorld(world: SCNPhysicsWorld, didBeginContact contact:SCNPhysicsContact) spa

QQ20170416-103934@2x.png

小球的設置

動態形體,受重力影響,類掩碼1,碰撞掩碼14,物理形狀默認,範圍1 3d

QQ20170416-105624@2x.png
QQ20170416-105635@2x.png
QQ20170416-105646@2x.png
QQ20170416-105656@2x.png

石頭的設置

靜態形體,不受重力,類掩碼2,碰撞掩碼1,物理形狀默認 代理

QQ20170416-105925@2x.png
QQ20170416-105936@2x.png
QQ20170416-105950@2x.png

##示例代碼

//0.碰撞的代理方法
extension GameViewController : SCNPhysicsContactDelegate {
  func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
    // 1.肯定小球是哪一個節點
    var contactNode:SCNNode!
    if contact.nodeA.name == "ball" {
      contactNode = contact.nodeB
    } else {
      contactNode = contact.nodeA
    }
// 2.若是是和珍珠碰撞,則隱藏珍珠,30秒後從新顯示
    if contactNode.physicsBody?.categoryBitMask == CollisionCategoryPearl
  {
      contactNode.hidden = true
      contactNode.runAction(SCNAction.waitForDurationThenRunBlock(30) { (node:SCNNode!) -> Void in
      node.hidden = false
    })
   }
// 3.若是是和柱子或木箱碰撞,能夠在這裏添加聲音效果
  if contactNode.physicsBody?.categoryBitMask == CollisionCategoryPillar || ontactNode.physicsBody?.categoryBitMask == CollisionCategoryCrate {
  } }
}
複製代碼
相關文章
相關標籤/搜索