說明
本系列文章是對<3D Apple Games by Tutorials>一書的學(xué)習(xí)記錄和體會此書對應(yīng)的代碼地址
設(shè)置node屬性
對一個小球節(jié)點設(shè)置屬性:
QQ20170405-235240@2x.png
- Physics Body(物理形體):設(shè)置為Dynamic時,Scene Kit將會全面接管小球的運動
- Settings(設(shè)置):Mass(質(zhì)量),Friction(摩擦),Restitution(彈性),Rolling friction(滾動摩擦),Damping(阻尼),Angular damping(角阻尼),Charge(充值).
- Velocity(速度): Linear velocity(線速度),Angular velocity(角速度),Linear factor(線性因子),Angular factor(角因子).Linear factor線性因子設(shè)置為 (x:1, y:0, z:1)時,作用在y軸的物理力將歸零,不受y軸方向影響.
- Bit Masks(位掩碼):Category mask(分類掩碼)決定自己屬于哪一類,Collision mask(碰撞掩碼)決定自己能和哪一類物體碰撞,iOS9后新增Contact mask(接觸掩碼)決定和哪類物體的碰撞會調(diào)用代理.
-
Physics Shape(物理形狀):iOS9新增Collision Margin(碰撞邊距)
iOS9以后新增屬性:
QQ20170408-232555@2x.png
位掩碼的解釋
Scene Kit的位掩碼設(shè)計其實和cocos2d-x3.0是類似的.
每次碰撞時,用自己的Collision mask(碰撞掩碼)和別人的Category mask(分類掩碼)做按位與運算,運算結(jié)果為零則不能碰撞,運算結(jié)果不為零則會碰撞.
同理Contact mask(接觸掩碼)也是和別人的Category mask(分類掩碼)做按位與運算,運算結(jié)果為零則不會通知,運算結(jié)果不為零則會通知.
//設(shè)置各節(jié)點的Category mask(分類掩碼)
//Ball: 1 (Decimal) = 00000001 (Binary)
//Barrier: 2 (Decimal) = 00000010 (Binary)
//Brick: 4 (Decimal) = 00000100 (Binary)
//Paddle: 8 (Decimal) = 00001000 (Binary)
enum ColliderType: Int {
case Ball = 0b1
case Barrier = 0b10
case Brick = 0b100
case Paddle = 0b1000
}
//設(shè)置小球與哪些類型碰撞時調(diào)用代理通知
ballNode.physicsBody?.contactTestBitMask = ColliderType.Barrier.rawValue
| ColliderType.Brick.rawValue | ColliderType.Paddle.rawValue
碰撞代理
scnScene.physicsWorld.contactDelegate = self
設(shè)置SCNPhysicsContactDelegate,會有三個代理方法:
- physicsWorld(_:didBeginContact:):該方法只在兩個物體接觸時調(diào)用一次.默認不調(diào)用,需要設(shè)置位掩碼決定后才會調(diào)用.
- physicsWorld(_:didUpdateContact:):該方法在碰撞發(fā)生后調(diào)用,能提供碰撞進行過程中附加信息.
- physicsWorld(_:didEndContact:):該方法只在兩個物體脫離接觸時調(diào)用一次.