iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别

关联知识: Swift 2D游戏、SpriteKit、SKPhysicsBody、SKSpriteNode. 

使用语言Swift 5.0

第一个话题: 碰撞角度矫正

先说问题: 

    在学习和研究SpriteKit的过程中. 作者在写一个类似于打豆豆的游戏, 遇到一个小概率事件的bug: 刚体球在碰撞方形刚体后, 可能出现“水平”或“上下”来回回弹和折返, 而无外力干涉的情况下, 将陷入无限循环. 就是小球有可能会在左右、或者上下两个边界之间做循环往返运动而导致游戏无法继续进行下去,于是我打算让小球在垂直撞向边界时改变一下方向,但是速度不变. 


iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别_第1张图片

可用解决办法:  

1. 回弹面的对面方向使用不同方向的刚体(即将方形光滑刚体表面处理为不规则平面刚体, 或者随机面刚体), 以此来避免进入无限循环.  

不推荐此方法. 一则是刚体不规则表面处理太过随机, 不利于游戏体验. 

2. (推荐). 在遇到此情况时, 可以将刚体球运动方向施加一个旋转向量, 施加Impulse(后续会说明为什么不是Force). 

 这样的好处是, 改变球的方向,不改变向量大小(即速度), 因此只会更改刚体球的角度, 而不会影响到刚体球的速度. 

操作方法:

1. 将刚体球的碰撞面(碰撞对象).都增加为contactTestBitMask. Contact Test检测对象.

将Border也增加为刚体Contact Test检测对象

2. 碰撞检测和处理方法

tips: 碰撞代理对象捕获的两个碰撞对象是无序的, 因此要对碰撞对象进行处理. 需要明确bodyA和bodyB分别是谁. 因此需要进行排序处理. 处理参考代码如下:

iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别_第2张图片
处理无序的contact对象

3. 旋转向量(我们旋转30度(为了方面计算sin30, tan30等值). 先上代码(原理在文后):

iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别_第3张图片
施加旋转向量(dx_,dy_)和向量取值

旋转向量原理如下: (看不懂的同学可以自行百度“向量”, “三角函数”, “旋转向量”等有关知识. 


iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别_第4张图片
旋转向量原理和计算施加的向量(dx',dy')

自此. bug解决. 永不再犯


第二个话题: impulse 和 force区别

这个话题有点多余, 知识顺便补一下知识:

1. applyImpulse: 直接叠加速度. 

与ApplyForce不同,ApplyImpulse不会产生力,而是直接影响刚体的速度。通过ApplyImpulse方法添加的速度会与刚体原有的速度叠加,产生新的速度。

2. applyForce: 施加持续的力, 速度会持续增加. 但是速度不会立刻改变. 

与ApplyImpulse不同,  applyForce方法会在刚体上施加一个力。学过物理力学的同学都知道,F=ma,有了力F就有了加速度a,有了加速度,物体就会有速度,就会慢慢动起来。(但是不会立马动起来,因为力不会直接影响速度)。

举个简单的例子,小明推一个静止的箱子,箱子不会立马飞出去,而是慢慢的、越来越快的动起来(减速也一样)


See ya!!

你可能感兴趣的:(iOS 碰撞角度矫正 及 applyImpulse 和 applyForce的区别)