Spritekit之SKPhysicsWorld

完成游戏的物理系统设置,需要完成以下几点: 
1、设置你想赋予节点的physicsbody的各属性
2、设置整个游戏世界的物理系统,即scene的物理属性 
3、场景scene签订contactDelegate代理,实现didBegin代理方法,处理碰撞逻辑
self.physicsWorld.gravity = CGVector(dx: 0, dy: -9.8)  /// 物理世界的重力
self.physicsWorld.contactDelegate = self               /// 碰撞代理
 
SKPhysicsBody
常用属性:
friction :CGFloat摩擦力,就是物体表面的粗糙程度,在其上面运动的物体会受到其friction的影响 0.0~1.0, 默认0.2
restitution :CGFloat 弹性系数,在碰撞的时候决定碰撞效果的强弱 0.0~1.0, 默认0.2
isDynamic : Bool,node是否能被物理模拟移动
affectedByGravity : Bool,node是否受重力影响 
allowsRotation : Bool,node是否能旋转
categoryBitMask: UInt32 它标记了物体属于那一类物体
collisionBitMask: UInt32 它标记了哪些物体可以跟其发生碰撞
contactTestBitMask: UInt32 它标记了哪些物体会和其发生碰撞后产生一些影响
 
常用方法:

open func applyForce(_ force: CGVector) //给对象施加力

open func applyForce(_ force: CGVector, at point: CGPoint) //给对象施加持续力,根据牛顿第二定律产生加速度,并在指定的点上产生效果,如果point不为.zero,那么物体由于受力的作用会发生旋转

open func applyTorque(_ torque: CGFloat) //向物理体应用一个扭矩(torque),这个扭矩会导致物理体围绕其质心旋转,正值为顺时针

open func applyImpulse(_ impulse: CGVector)

open func applyImpulse(_ impulse: CGVector, at point: CGPoint) //向物理体应用一个冲量(impulse),这个冲量在指定的点上产生效果,并导致物理体获得一个瞬间的速度变化。冲量的效果取决于物理体的质量、惯性以及冲量的大小和方向.它不会导致物理体持续受到力的作用,而是给予物理体一个瞬间的速度变化

open func allContactedBodies() -> [SKPhysicsBody] //返回一个与当前对象接触的所有SKPhysicsBodies数组

 

使用物理特性时遇到的问题:

在.sks文件中设置node节点的physics时,如果未在控制器中将view.ignoresSiblingOrder = false, 加载节点可能会呈现物理属性设置无效的bug

更多内容待继续补充...

 

 

 

 

posted on 2024-10-22 15:32  E-ran  阅读(44)  评论(0)    收藏  举报

导航