【问题标题】:How to use correctly Scenekit's category mask, collision mask and physicsbody, contactTestBitMask and make proper collisions?如何正确使用 Scenekit 的类别遮罩、碰撞遮罩和物理体、contactTestBitMask 并进行适当的碰撞?
【发布时间】:2019-05-30 10:15:18
【问题描述】:

我一直在努力学习scenekit,已经完成了一本书,但只有碰撞检测部分没看懂,也许是最重要的部分。 有类别掩码、合谋掩码和physicsbody?.contactTestBitMask。

我想创建一个简单的游戏来实现这一点,但我卡住了。我不确定我是否明白这一点。

在游戏中,有一个球,收集珍珠,远离岩石和洞。在这种情况下:

类别掩码:

  • 球 = 0b0001
  • 珍珠 = 0b0010
  • 岩石 = 0b0100
  • 孔 = 0b1000

physicsBody?.contactTestBitMask:

  • 球=珍珠||岩石 // 表示 0b1110
  • 珍珠 = 1
  • 岩石 = 1

合谋掩码为 1,因为它们都相互碰撞。

我不确定我是否遇到了这个碰撞问题。所以在我开始写代码之前,我想确定一下。在 SCNPhysicsContactDelegate 中,下面的函数解决了当他们相互联系时如何学习:

physicsWorld(_ didBegin contact: _) {

var contactNode:SCNNode!
if contact.nodeA.name == "ball" {
 contactNode = contact.nodeB
 } else {
 contactNode = contact.nodeA
}

if contactNode.physicsBody?.categoryBitMask == 0b0010 {
 // mean pearls
 // raise score etc
}

if contactNode.physicsBody?.categoryBitMask == 0b0100 || 0b1000{
 if contactNode.name == "Rock" { print("You rocked") }
 if contactNode.name == "Hole" { print("You need to climb") }
}

}

我已经搜索了 youtube 和堆栈,但只有一种解释。 Stack Link Youtube 视频没有解释这些。 图书示例受版权保护,所以我不能放在这里。

谢谢, 祝你有美好的一天。

【问题讨论】:

    标签: swift collision-detection scenekit


    【解决方案1】:

    您没有使用按位运算符。 https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html

    改变

    if contactNode.physicsBody?.categoryBitMask == 0b0100 || 0b1000
    

    if contactNode.physicsBody?.categoryBitMask == 0b0100 | 0b1000
    

    单曲 |和 & 是用于此类按位运算的正确运算符。

    【讨论】:

      【解决方案2】:

      碰撞时有3个功能需要设置:

      mBallBody->setCategoryBitmask(CATEGORY_BALL);
      mBallBody->setContactTestBitmask(CATEGORY_WALL_LEFT_RIGHT | CATEGORY_WALL_TOP | CATEGORY_BOX | CATEGORY_LAUNCHER);
      mBallBody->setCollisionBitmask(CATEGORY_WALL_LEFT_RIGHT | CATEGORY_WALL_TOP | CATEGORY_BOX | CATEGORY_LAUNCHER);
      
      1. setCategoryBitmask() --> 设置这个物理属于什么类别!
      2. setContactTestBitmask() --> 一个掩码,定义哪些类别的物体会导致与该物理物体的交叉通知
      3. setCollisionBitmask() --> 定义哪些类别的物理体可以与该物理体发生碰撞的掩码

      所以说球和墙,球可以与墙碰撞,所以你将接触测试位掩码设置为球 |墙, 使用|是位掩码操作。

      所以你需要设置碰撞类别位掩码 1 2 4 8 16 32 等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多