美文网首页ARKit开发
13-Intermediate-Collision-Detect

13-Intermediate-Collision-Detect

作者: 095b62ead3cd | 来源:发表于2020-06-15 21:02 被阅读0次

    文章选自掘金苹果API搬运工的文章[SceneKit专题]13-Intermediate-Collision-Detection碰撞检测中级
    主要记录自己在学习ARKit的过程中看到的好的文章,避免到时候链接失效无法找到原文的情况,非常感谢原博主的辛勤付出,也在此分享出来跟大家一起学习。

    在迷宫类游戏中,小球需要和不同物体碰撞,和不同物体碰撞后又会有不同结果


    迷宫类游戏中的小球

    bit masks位掩码

    就是二进制的值,可以用来做位运算,运算结果为0表示关,运算结果为其它值表示开


    bit masks位掩码

    Category masks分类掩码

    用二进制数来代表不同物体的分类


    Category masks分类掩码

    Collision masks碰撞掩码

    表示自己能和哪些类别物体碰撞,如BALL(球)的值14=8+4+2,代表可以和2(STONE石头),4(PILLAR柱子),8(CRATE木箱)三类物体碰撞.而其他值都是1,代表只可以和1(BALL球)碰撞


    Collision masks碰撞掩码

    Contact masks接触掩码

    表示和哪些物体碰撞时要触发代理事件.如BALL(球)的值14=8+4+2,代表和2(STONE石头),4(PILLAR柱子),8(CRATE木箱)三类物体碰撞时调用代理方法.而其他值都是0,代表碰撞时不通知代理.physicsWorld(world: SCNPhysicsWorld, didBeginContact contact:SCNPhysicsContact)


    Contact masks接触掩码

    小球的设置

    动态形体,受重力影响,类掩码1,碰撞掩码14,物理形状默认,范围1


    小球的设置

    石头的设置

    静态形体,不受重力,类掩码2,碰撞掩码1,物理形状默认


    石头的设置

    示例代码

    //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 {
      } }
    }
    

    相关文章

      网友评论

        本文标题:13-Intermediate-Collision-Detect

        本文链接:https://www.haomeiwen.com/subject/gwahxktx.html