举着简单的例子,例如我们小时候玩的弹珠。用一个弹珠去撞击另一个弹珠,会看到一个弹珠往前移,一个往后移。这就是两个弹珠发生物理碰撞后的现象。同样的,在MC中的物理碰撞也是一样的。当一个角色与另一个角色发生碰撞后弹开的现象。
愤怒的小鸟都玩过吧。这里面就有很多物理碰撞。
图9-3-1
如上图所示的红色箭头是两个石头的受力方向。向下的一个重力。和石头之间碰撞后的一个力。两个力叠加在一起让石头产生了碰撞后的运动轨迹(黑色线)。碰撞后如下图。
图9-3-2
物理世界的元素
现在我们来看看怎么实现这样的效果。
图9-3-1-1
从图9-3-1-1中,我们可以看到创建用到的几种角色。角色分为动态和静态两种。而同态和静态中又分别分为圆形物体和矩形物体。(上图我们会将小鸟和木棍设为动态的,木箱设为静态的)
物理世界:就是我们要在游戏编辑器上模拟现实世界中的向下的吸引力。在下落的时候不用动画帧去改变角色的移动和旋转。让牛顿来控制它。可以给这个世界一个范围。
在MC中它的怎么设置物理世界的呢?下面我们看看如何操作。
首先,点击菜单项中的设置——〉游戏设置如下图:
图9-3-1-2
在物理世界设置的第一行“使用物理世界”选择下,物理世界就打开了。我们可以设置这个物理世界的选项。我们都了解加速度 :顾名思义就是x轴方向的重力加速度,正数向右,负数向左 :y轴方向的重力加速度,正数向下,负数向上。地面高度就是设置水平面的位置。
其次,设置好了物理世界,我们往物理世界里面加角色。在角色的属性中选择如下图,红色框选项选择后就将角色放进物理世界。我们分别把角色都加到物理世界。
图9-3-1-3
上面说到的静态物体跟动态物体我们来设下。我们看见只有静态物体的选项没有动态物体的选项。这边默认为动态物体。
接下来我们来设置小鸟的速度。添加小鸟的鼠标键按下事件——〉添加事件——〉移动到——〉确定。如下图
图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
点击小鸟
图9-3-1-6
小鸟撞到动态物体木头时的效果。
图9-3-1-7
撞到静态物体箱子时的效果。
图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
首先创建上图中的各个角色:背景、小鸟、宝箱、木棍。
点击MC左边的角色控件中的角色,修改角色名:actBackground。如下图
图9-3-3-2
添加背景的图片如下图:
图9-3-3-3
图9-3-3-4
图9-3-3-5
同上步骤创建出小鸟、木箱、木棍等角色。
在view的创建事件添加物理世界
图9-3-3-6
图9-3-3-7
代码如下:
phyCreateWorld(0, 10, 270);
将各个角色设置成静态或动态的物体
小鸟设为动态物体
图9-3-3-8
图9-3-3-9
代码如下:
phyCreateDynamicCircle(1, 0.3, 0, 0, 0);//动态圆形
//phyCreateDynamicBody(1, 0.3, 0, 0, 0);//动态矩形
如上将木棍设成动态矩形物体
将宝箱设成静态矩形物体
图9-3-3-10
图9-3-3-11
代码如下:
//phyCreateStaticCircle(1, 0.3, 0, 0, 0);//静态圆形
phyCreateStaticBody(1, 0.3, 0, 0, 0);//静态矩形
模拟物理世界“更新”
如下图:
图9-3-3-12
图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
可以试试大炮打方块的碰撞。
图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