說明
本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會
在迷宮類遊戲中,小球需要和不同物體碰撞,和不同物體碰撞後又會有不同結果
bit masks位掩碼
就是二進位制的值,可以用來做位運算,運算結果為0表示關,運算結果為其它值表示開
Category masks分類掩碼
用二進位制數來代表不同物體的分類
Collision masks碰撞掩碼
表示自己能和哪些類別物體碰撞,如BALL(球)的值14=8+4+2,代表可以和2(STONE石頭),4(PILLAR柱子),8(CRATE木箱)三類物體碰撞.而其他值都是1,代表只可以和1(BALL球)碰撞
Contact masks接觸掩碼
表示和哪些物體碰撞時要觸發代理事件.如BALL(球)的值14=8+4+2,代表和2(STONE石頭),4(PILLAR柱子),8(CRATE木箱)三類物體碰撞時呼叫代理方法.而其他值都是0,代表碰撞時不通知代理.physicsWorld(world: SCNPhysicsWorld, didBeginContact contact:SCNPhysicsContact)
小球的設定
動態形體,受重力影響,類掩碼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 {
} }
}
複製程式碼