Corona使用了强大的Box2D物理引擎,并提供方便的编程接口,让你不需要了解太多物理学方面的知识就可以灵和的使用。一般来说,只要你懂得地心引力这回事,知道重的东西比轻的东西下落速度快,你就可以很好的使用corona物理引擎,是不是觉得很轻松?哈哈。
但是有几个属性,会影响物体的一些行为,而且在现实世界中我们并不感觉的到。这体现在游戏中,物理引擎可能并不像你期望的一样正常工作。这篇文章就是希望通过设置这些属性来告诉你一些常见问题的解决方案。
物体移动的太慢或者太快
有多项因素,可以影响对象如何快速反应比重(以及其他的物理力量)。
我建议你在创建物理body的时候设置密度参数(density ),密度会影响东西的“重”量,所以如果需要施加力量时,需要考虑此属性。
另外一点,你要看一看physics.setScale()。这不会改变任何物体的表现,但是会极大地影响它的行为,尤其是你希望通过设置它的高低来使东西移动慢/快。默认值是30。
物体穿越了墙壁
一个比较普遍的问题就是,我经常看到一些人说,有时,物体在高速运动时,会穿越墙壁。这可能有以下几个原因,你们可以根绝项目的情况,自己去测试一下:
body.isBullet - 此属性将导致身体受到连续碰撞,所以它减少了在高速行驶时失踪碰撞的机会。
density密度属性会影响物体的重量,这可能是一个重要原因,但是你改变这个值可能并不能彻底解决你的问题。
我曾经有一个项目,发现我的那个静态物体太小太单薄了,我把他的资源图像设置大一点,结果就好了,但是这样做并不太好。
physics.setScale()属性,会极大地影响了物体对环境的反应。尝试把它和其他物体一起进行碰撞,看它是否解决您的问题。
physics.setVelocityIterations()和physics.setPositionIterations()确定的位置和速度计算的计算周期。值越高,越消耗性能,然而,设置合适的阈值可能会帮你解决问题。
物体贴在墙壁上
经常碰到的一个问题是,物体本来应该运动的或者会反弹的,结果贴在墙壁上了。这里可能有一些办法可以帮你解决这个问题,可以看一看:
尝试调整的摩擦( friction)和物理反弹属性(bounce )。
前面的问题提出的解决方案中提到,physics.setVelocityIterations()和physics.setPositionIterations()函数可能会有作用。
最后一个办法,你可以随时添加碰撞的监听对象,并施加少量的力量使之发生碰撞,不断的调整观察。当然,这是一种变通方法,所以我还是强烈建议调整属性和设置。
不要不愿意尝试做试验
当然上述的问题只是极少数大家经常会碰到的关于物理引擎的问题,对于解决类似问题最好的办法是,了解Corona Box2D的工作原理。
我们是建议是开发“Physics”示例的源代码,例如Bullet以及physics.setScale()是如何影响物品的,物体的密度,反弹等属性是如何影响物体的,等等。