[SceneKit专题]13.Intermediate Coll
2017-04-12 本文已影响248人
苹果API搬运工
说明
本系列文章是对<3D Apple Games by Tutorials>一书的学习记录和体会此书对应的代码地址
在迷宫类游戏中,小球需要和不同物体碰撞,和不同物体碰撞后又会有不同结果
![](https://img.haomeiwen.com/i1806489/8983d8524c697332.png)
bit masks位掩码
就是二进制的值,可以用来做位运算,运算结果为0表示关,运算结果为其它值表示开
![](http://upload-images.jianshu.io/upload_images/1806489-4b9d7645ab413397.png)
Category masks分类掩码
用二进制数来代表不同物体的分类
![](http://upload-images.jianshu.io/upload_images/1806489-9546e9023bedf821.png)
Collision masks碰撞掩码
表示自己能和哪些类别物体碰撞,如BALL(球)的值14=8+4+2,代表可以和2(STONE石头),4(PILLAR柱子),8(CRATE木箱)三类物体碰撞.而其他值都是1,代表只可以和1(BALL球)碰撞
![](http://upload-images.jianshu.io/upload_images/1806489-8a5d88e11c581ae1.png)
Contact masks接触掩码(通知掩码?)
表示和哪些物体碰撞时要触发代理事件.如BALL(球)的值14=8+4+2,代表和2(STONE石头),4(PILLAR柱子),8(CRATE木箱)三类物体碰撞时调用代理方法.而其他值都是0,代表碰撞时不通知代理.physicsWorld(world: SCNPhysicsWorld, didBeginContact contact:SCNPhysicsContact)
![](http://upload-images.jianshu.io/upload_images/1806489-6630d5a7a825142f.png)
小球的设置
动态形体,受重力影响,类掩码1,碰撞掩码14,物理形状默认,范围1
![](http://upload-images.jianshu.io/upload_images/1806489-c0d2f1bddb826608.png)
![](http://upload-images.jianshu.io/upload_images/1806489-4ccc4752e725c889.png)
![](http://upload-images.jianshu.io/upload_images/1806489-9ee4e53b62a47dac.png)
![](http://upload-images.jianshu.io/upload_images/1806489-3a593a7dba88063f.png)
石头的设置
静态形体,不受重力,类掩码2,碰撞掩码1,物理形状默认
![](http://upload-images.jianshu.io/upload_images/1806489-177863452b1b0a8f.png)
![](http://upload-images.jianshu.io/upload_images/1806489-eacfcd15f61dae1c.png)
![](http://upload-images.jianshu.io/upload_images/1806489-e85451ad6230ceec.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 {
} }
}