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

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

9-3-1.png


图9-3-1


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

9-3-2.png


图9-3-2


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

9-3-1-1.png


图9-3-1-1


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

9-3-1-2.png


图9-3-1-2


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

9-3-1-3.png


图9-3-1-3


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

9-3-1-4.png


图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();
测试一下:

9-3-1-5.png


图9-3-1-5


点击小鸟

9-3-1-6.png


图9-3-1-6


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

9-3-1-7.png


图9-3-1-7


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

9-3-1-8.png


图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的物理世界效果,那么下面我们一起来动手实现一下。

9-3-3-1.png


图9-3-3-1


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

9-3-3-2.png


图9-3-3-2


添加背景的图片如下图:

9-3-3-3.png


图9-3-3-3


9-3-3-4.png


图9-3-3-4


9-3-3-5.png


图9-3-3-5



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

9-3-3-6.png


图9-3-3-6


9-3-3-7.png


图9-3-3-7


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

9-3-3-8.png


图9-3-3-8


9-3-3-9.png


图9-3-3-9


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

9-3-3-10.png


图9-3-3-10


9-3-3-11.png


图9-3-3-11


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

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

9-3-3-12.png


图9-3-3-12


9-3-3-13.png


图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);

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

9-3-3-14.png


图9-3-3-14


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

9-3-3-15.png

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值