MC新手入门(四十八)------ 物理世界

时间:2021-09-27 20:09:29
   物理碰撞:就是两个实体间发生撞击相互弹开。
      举着简单的例子,例如我们小时候玩的弹珠。用一个弹珠去撞击另一个弹珠,会看到一个弹珠往前移,一个往后移。这就是两个弹珠发生物理碰撞后的现象。同样的,在MC中的物理碰撞也是一样的。当一个角色与另一个角色发生碰撞后弹开的现象。
      愤怒的小鸟都玩过吧。这里面就有很多物理碰撞。

MC新手入门(四十八)------ 物理世界


图9-3-1


      如上图所示的红色箭头是两个石头的受力方向。向下的一个重力。和石头之间碰撞后的一个力。两个力叠加在一起让石头产生了碰撞后的运动轨迹(黑色线)。碰撞后如下图。

MC新手入门(四十八)------ 物理世界


图9-3-2


物理世界的元素
现在我们来看看怎么实现这样的效果。

MC新手入门(四十八)------ 物理世界


图9-3-1-1


      从图9-3-1-1中,我们可以看到创建用到的几种角色。角色分为动态和静态两种。而同态和静态中又分别分为圆形物体和矩形物体。(上图我们会将小鸟和木棍设为动态的,木箱设为静态的)
      物理世界:就是我们要在游戏编辑器上模拟现实世界中的向下的吸引力。在下落的时候不用动画帧去改变角色的移动和旋转。让牛顿来控制它。可以给这个世界一个范围。
      在MC中它的怎么设置物理世界的呢?下面我们看看如何操作。
      首先,点击菜单项中的设置——〉游戏设置如下图:

MC新手入门(四十八)------ 物理世界


图9-3-1-2


      在物理世界设置的第一行“使用物理世界”选择下,物理世界就打开了。我们可以设置这个物理世界的选项。我们都了解加速度 :顾名思义就是x轴方向的重力加速度,正数向右,负数向左 :y轴方向的重力加速度,正数向下,负数向上。地面高度就是设置水平面的位置。
      其次,设置好了物理世界,我们往物理世界里面加角色。在角色的属性中选择如下图,红色框选项选择后就将角色放进物理世界。我们分别把角色都加到物理世界。

MC新手入门(四十八)------ 物理世界


图9-3-1-3


      上面说到的静态物体跟动态物体我们来设下。我们看见只有静态物体的选项没有动态物体的选项。这边默认为动态物体。
      接下来我们来设置小鸟的速度。添加小鸟的鼠标键按下事件——〉添加事件——〉移动到——〉确定。如下图

MC新手入门(四十八)------ 物理世界


图9-3-1-4


在actBird角色的  鼠标键按下——〉 脚本编辑器  写如下代码
                     phySetLinearVelocity(500, -100);
在actBird角色的角色绘制——〉脚本编辑器 写上下面一段代码
                      inti;
                      if(phyIsAwake() ==  0)
                      {
                              DestroyActor("actBird");
                      }
                      for (i = 0; i< 60/real_fps + 1; ++i)
                      {
                               phyWorldStep(1.0/60, 8, 3);
                      }
                      phyActorUpdate();
测试一下:

MC新手入门(四十八)------ 物理世界


图9-3-1-5


点击小鸟

MC新手入门(四十八)------ 物理世界


图9-3-1-6


小鸟撞到动态物体木头时的效果。

MC新手入门(四十八)------ 物理世界


图9-3-1-7


撞到静态物体箱子时的效果。

MC新手入门(四十八)------ 物理世界


图9-3-1-8


要实现更复杂的一些碰撞效果的话,就需要学习一下物理世界的几个重要的函数。

物理世界函数
1.首先要创建一个物理世界函数
phyCreateWorld
功能:创建一个物理世界
int phyCreateWorld(double gravity_x, double gravity_y, int positionY);
参数:
             gravity_x  :x轴方向的重力加速度,正数向右,负数向左。(double类型数值)
             gravity_y :y轴方向的重力加速度,正数向下,负数向上。(double类型数值)
             position  :设置水平线的位置。(int类型数值)

2.创建矩形动态物体、矩形静态物体,圆形动态物体、圆形动静态物体函数
phyCreateDynamicBody
功能:创建矩形动态物体
void phyCreateDynamicBody(double density, double friction, double restitution, double linearDamping, double angularDamping); 
参数:
            Density :设置物体的密度,以kg/m3为单位。(double类型数值)
             Friction :设置物体的摩擦系数,范围[0.0-1.0]。(double类型数值)
             Restitution :设置物体的弹力系数,范围[0.0-1.0]。(double类型数值)
             linearDamping :设置物体的空气阻力,范围[0.0-1.0]。(double类型数值)
             angularDamping :设置物体的旋转阻力,范围[0.0-1.0]。(double类型数值)

phyCreateStaticBody
功能:创建矩形静态物体
void phyCreateStaticBody(double density, double friction, double restitution, double linearDamping, double angularDamping); 
参数:
             Density :设置物体的密度,以kg/m3为单位。(double类型数值)
             Friction :设置物体的摩擦系数,范围[0.0-1.0]。(double类型数值)
             Restitution :设置物体的弹力系数,范围[0.0-1.0]。(double类型数值)
             linearDamping :设置物体的空气阻力,范围[0.0-1.0]。(double类型数值)
             angularDamping :设置物体的旋转阻力,范围[0.0-1.0]。(double类型数值)

phyCreateDynamicCircle
功能:创建圆形动态物体
void phyCreateDynamicCircle(double density, double friction, double restitution, double linearDamping, double angularDamping); 
参数:
             Density :设置物体的密度,以kg/m3为单位。(double类型数值)
             Friction :设置物体的摩擦系数,范围[0.0-1.0]。(double类型数值)
             Restitution :设置物体的弹力系数,范围[0.0-1.0]。(double类型数值)
             linearDamping :设置物体的空气阻力,范围[0.0-1.0]。(double类型数值)
             angularDamping :设置物体的旋转阻力,范围[0.0-1.0]。(double类型数值)

phyCreateStaticCircle
功能:创建圆形静态物体
void phyCreateDynamicCircle(double density, double friction, double restitution, double linearDamping, double angularDamping);
参数:
             Density :设置物体的密度,以kg/m3为单位。(double类型数值)
             Friction :设置物体的摩擦系数,范围[0.0-1.0]。(double类型数值)
             Restitution :设置物体的弹力系数,范围[0.0-1.0]。(double类型数值)
             linearDamping :设置物体的空气阻力,范围[0.0-1.0]。(double类型数值)
             angularDamping :设置物体的旋转阻力,范围[0.0-1.0]。(double类型数值)

3.更新函数
phyActorUpdate()
功能:更新物体状态。
void phyActorUpdate();
无参数,无返回值。

4.判断物体是否停下来函数
phyIsAwake();
功能:判断物体是否停下来
int phyIsAwake();
判断物体是否停下。返回值是 1或0。1为真,0为假。

phySetLinearVelocity
功能:设置初始速度
void phySetLinearVelocity(float xVelocity, float yVelocity); 
参数:
             xVelocity: x轴的速度,>0代表向右的速度,<0代表向左的速度。(float类型数值)
             yVelocity:y轴的速度,>0代表向下的速度,<0代表向上的速度。(float类型数值)

phyWorldStep
功能:模拟物理世界
void phyWorldStep(double timeStep, int velocityIterations, int positionIterations); 
参数:
             timeStep :时间一般都是1.0除以帧数,一般是60帧。
             velocityIterations :速度迭代,迭代次数越多,速度就越接近现实,但是对性能要求就越高,一般设置成8。
             positionIterations :位置迭代,迭代次数越多,位置就越接近现实,但是对性能要求就越高,一般设置成3。

物理碰撞的实例
本小节是要实现如图9-3-3-1的物理世界效果,那么下面我们一起来动手实现一下。

MC新手入门(四十八)------ 物理世界


图9-3-3-1


首先创建上图中的各个角色:背景、小鸟、宝箱、木棍。
点击MC左边的角色控件中的角色,修改角色名:actBackground。如下图

MC新手入门(四十八)------ 物理世界


图9-3-3-2


添加背景的图片如下图:

MC新手入门(四十八)------ 物理世界


图9-3-3-3


MC新手入门(四十八)------ 物理世界


图9-3-3-4


MC新手入门(四十八)------ 物理世界


图9-3-3-5



同上步骤创建出小鸟、木箱、木棍等角色。
在view的创建事件添加物理世界

MC新手入门(四十八)------ 物理世界


图9-3-3-6


MC新手入门(四十八)------ 物理世界


图9-3-3-7


代码如下:
                      phyCreateWorld(0, 10, 270);
将各个角色设置成静态或动态的物体
小鸟设为动态物体

MC新手入门(四十八)------ 物理世界


图9-3-3-8


MC新手入门(四十八)------ 物理世界


图9-3-3-9


代码如下:
                       phyCreateDynamicCircle(1, 0.3, 0, 0, 0);//动态圆形
                       //phyCreateDynamicBody(1, 0.3, 0, 0, 0);//动态矩形
如上将木棍设成动态矩形物体
将宝箱设成静态矩形物体

MC新手入门(四十八)------ 物理世界


图9-3-3-10


MC新手入门(四十八)------ 物理世界


图9-3-3-11


代码如下:
                       //phyCreateStaticCircle(1, 0.3, 0, 0, 0);//静态圆形
                       phyCreateStaticBody(1, 0.3, 0, 0, 0);//静态矩形

模拟物理世界“更新”
如下图:

MC新手入门(四十八)------ 物理世界


图9-3-3-12


MC新手入门(四十八)------ 物理世界


图9-3-3-13


在actBird角色的角色绘制时添加脚本编辑器 写上下面一段代码
                       inti;
                       if(phyIsAwake() == 0)
                       {
                               DestroyActor("actBird");
                       }
                       for (i = 0; i< 60/real_fps + 1; ++i)
                       {
                               phyWorldStep(1.0/60, 8, 3);
                       }
                       phyActorUpdate();

判断物体是否停下来。

在actBird角色的角色绘制时添加【脚本编辑器】写上下面一段代码
                        if(phyIsAwake())
                        {
                               DestroyActor("actBird");
                        }

设置速度
在actBird角色的【鼠标键按下】时添加【脚本编辑器】写如下代码:
                        phySetLinearVelocity(500, -100);

测试下看小鸟碰撞木棍后的效果。

MC新手入门(四十八)------ 物理世界


图9-3-3-14


可以试试大炮打方块的碰撞。

MC新手入门(四十八)------ 物理世界

2012-9-22 15:46:37 上传


图9-3-3-15


Demo下载地址:http://www.dongyo.cn/bbs/forum.php?mod=viewthread&tid=2530&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline