ios - 如何在 SceneKit 场景编辑器中设置多重碰撞
<p><p>我正在使用 XCode 7 中的新 SceneKit 编辑器。我设法与两个对象发生碰撞。我想知道如何指定与多个类别的冲突。假设玩家与地面和敌人发生碰撞。仅使用这两个输入字段如何实现?</p>
<p> <a href="/image/62RGN.png" rel="noreferrer noopener nofollow"><img src="/image/62RGN.png" alt="XCode7 Scenekit Editor Collision"/></a> </p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>关键是要确保您的类别都是 2 的幂(2、4、8、16 等),这样您就可以充分利用位掩码。</p>
<p>要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面显示的 <code>willCollide</code> 函数的操作。按位与 (<code>&</code>) 运算符用于检查 Ints 中的任何位是否在 <code>category</code> 和 <code>collidesWith</code> 中匹配。如果任何位匹配,则对象应该发生碰撞。</p>
<pre><code>func willCollide(category:Int, collidesWith:Int) -> Bool {
return category & collidesWith != 0
}
</code></pre>
<p>使用 2 的幂意味着每个类别在 Int 中都有一个唯一的位位置。</p>
<pre><code>let cat1:Int = 2 // 00010
let cat2:Int = 4 // 00100
let cat3:Int = 8 // 01000
let cat4:Int = 16 // 10000
willCollide(cat1, collidesWith: cat1)// true
willCollide(cat1, collidesWith: cat2)// false
</code></pre>
<p>您可以使用按位或 (<code>|</code>) 运算符来组合多个 Int,在这种情况下允许一个类别联系多个其他类别。</p>
<pre><code>let cat1and2 = cat1 | cat2//00110 or 6 in decimal
willCollide(cat1, collidesWith: cat1and2)// true
willCollide(cat2, collidesWith: cat1and2)// true
willCollide(cat3, collidesWith: cat1and2)// false
</code></pre>
<p>对于您的示例,类似以下的内容会起作用;</p>
<ul>
<li>播放器
<ul>
<li>类别 = 2</li>
<li>碰撞掩码 = 12
<ul>
<li><code>4 | 8 = 0010 | 0100 = 0110 = 12</code></li>
</ul></li>
</ul></li>
<li>敌人
<ul>
<li>类别 = 4</li>
<li>碰撞掩码 = 2</li>
</ul></li>
<li>地面
<ul>
<li>类别 = 8</li>
<li>碰撞掩码 = 2 </li>
</ul></li>
</ul>
<p>为敌人和地面设置碰撞掩码很重要,因为有时敌人会与玩家发生碰撞。这与玩家与敌人碰撞不同。注意:我省略了敌人也会接触地面的部分,反之亦然。</p></p>
<p style="font-size: 20px;">关于ios - 如何在 SceneKit 场景编辑器中设置多重碰撞,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/33199502/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/33199502/
</a>
</p>
页:
[1]