11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 3306|回复: 0
上一主题 下一主题

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 2】掉落的苹果——b2Body刚体

[复制链接] TA的其它主题
发表于 2018-2-5 15:34:17 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 TKCB 于 2018-2-5 15:38 编辑

转载:9RIA游戏开发者社区(天地会)
作者:ladeng6666(拉登大叔)
作者博客:http://www.ladeng6666.com/blog/


【Box2D系列教程-导航帖】—拉登大叔出品(总贴)


上一节中,我们认识了Box2D世界,学习了它的创建方法。今天我们一起来扮演牛顿,认识一下Box2D世界中掉落的苹果。
在开始之前,我们想先说明两个内容:(ps:我用的Box2D 2.0.1)

1.Box2D中的计量单位是米
在Box2D中的计量单位是米m,而不是Flash中的像素px,在布置坐标时,要进行一个转换,1米=30个像素。所以Box2D中(a,b)点对于Flash中的(a*30,b*30)的位置,或者说Flash中的(c,d)位置对应Box2D中的(c/30,d/30)位置。

2. Box2D用b2DebugDraw进行模拟调试
Box2D是一个物理引擎,不会向Flash显示列表中添加任何显示对象。不过Box2D中有一个b2DebugDraw类,可以绑定一个显示对象,进行模拟调试。至于如何在Box2D中添加显示对象,在以后的学习中,我们再深入讨论。
b2DebugDraw的用法:
    1. 创建一个空的Sprite对象debugSprite,并添加到舞台中
    2. 创建一个b2DebugDraw对象debugDraw,并设置它的m_sprite属性值为debugSprite.
    3. 用world的SetDebugDraw方法,绑定debugDraw

3.World的更新:
Box2D的和Flash一样,需要实时更新,Flash中有ENTER_FRAME,b2world有step,其参数一表示模拟的时长,二表示限制碰撞后检测程式运行的次数,防止死循环。

刚体与DisplayObject的区别
掉落的苹果实际上是Box2D里的一个刚体b2Body,当然可以把他理解成Flash中的sprite,不过:

掉落的苹果实际上是Box2D里的一个刚体b2Body,当然可以把他理解成Flash中的sprite,不过:
b2Body
    它是Box2D中的一个物理模拟对象,不是可显示对象,但是可以通过b2DebugDraw来进行调试模拟
    它的计量单位是米m
    它通过b2World.createBody()来创建
Sprite
    它是显示对象,通过addChild添加即可显示
    它的计量单位是像素px
    通过new来创建,然后addChild添加后直接显示在舞台上

刚体创建的过程,与AS中new一个对象,addChild到舞台中显示比起来要复杂很多,刚体的创建可以看做是一个工厂模式,根据你的需求(b2BodyDef)生产指定的刚体


刚体的创建过程可以分为两个步骤:
1.创建刚体需求b2BodyDef。

[Actionscript3] 纯文本查看 复制代码
ar bodyRequest:b2BodyDef = new b2BodyDef();

在这个需求中,我们可以包括下面的内容:
a) position:刚体的坐标位置,单位是米m
b) angle:刚体的角度
c) 其他,在以后的学习中我们会陆续介绍

2. b2World工厂用createBody方法创建刚体产品,并自动将其添加到Box2D世界中,然后返回该刚体。

[Actionscript3] 纯文本查看 复制代码
body=world.CreateBody(bodyRequest);


定义刚体形状
到目前位置,我们已经成功添加了一个刚体。
讲个题外话,今天我同时的老婆生了,听到这个消息,你会问的第一个问题是什么?”男孩,女孩?”答对了!
把刚体当成我们的孩子吧。创建一个刚体后,你应该问什么?”方的,圆的?”(这孩子好挫啊!)非常正确。刚体的形状不是与生俱来的,需要用一个b2Shape的子类对象指定。刚体形状的创建过程同样也是一个工厂模式。


这个创建过程与b2Body的创建过程是一样的。我们的形状需求b2ShapeDef可以报考下面的内容:
a) density:质量
b) friction:表面摩擦力
c) restitution:表面张力,这个值越大,刚体越硬
d) SetAsBox:设置刚体为矩形
e) 其他,在以后的学习中我们会陆续介绍


好了创建b2Body刚体的完整过程就讲完了。我们在总结一下:
1. 创建刚体需求b2BodyDef
2. Box2D世界工厂根据需求用createBody方法创建刚体
3. 创建刚体形状需求b2ShapeDef的子类对象
4. B2Body工厂根据需求用createShape方法创建形状

实例练习
掌握了上面的内容,我相信完成下面的这个练习就不是什么难事了。
点击舞台的任意位置创建一个方形刚体。


代码
[Actionscript3] 纯文本查看 复制代码
package  
{
        import Box2D.Collision.b2AABB;
        import Box2D.Collision.Shapes.b2PolygonDef;
        import Box2D.Common.Math.b2Vec2;
        import Box2D.Dynamics.b2Body;
        import Box2D.Dynamics.b2BodyDef;
        import Box2D.Dynamics.b2DebugDraw;
        import Box2D.Dynamics.b2World;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        
        /**
         * ...
         * @author ladeng6666
         */
        public class Main extends Sprite 
        {
                private var world:b2World;
                private var body:b2Body;
                
                public function Main() 
                {
                        createWorld();
                        createDebug();
                        createBody(stage.stageWidth/2,0);
                        createGround();
                        
                        addEventListener(Event.ENTER_FRAME, loop);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);
                }
                
                private function onStageMouseDown(e:MouseEvent):void 
                {
                        createBody(mouseX,mouseY);
                }
                
                private function loop(e:Event):void 
                {
                        world.Step(1/30, 10);
                }
                
                private function createWorld():void 
                {
                        //1.创建一个环境
                        var environment:b2AABB = new b2AABB();
                        environment.lowerBound = new b2Vec2( -100, -100);
                        environment.upperBound = new b2Vec2(100, 100);
                        //2.声明重力
                        var gravity:b2Vec2 = new b2Vec2(0, 10);
                        //3.睡着的对象是否模拟
                        var doSleep:Boolean = true;
                        //4.创建b2World世界
                        world = new b2World(environment, gravity, doSleep);
                }
                
                private function createDebug():void 
                {
                        var debugSprite:Sprite = new Sprite();
                        addChild(debugSprite);
                        
                        var debugDraw:b2DebugDraw = new b2DebugDraw();
                        debugDraw.m_sprite = debugSprite;
                        debugDraw.m_drawScale = 30.0;
                        debugDraw.m_fillAlpha = 0.5;
                        debugDraw.m_lineThickness = 1.0;
                        debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;
                        
                        world.SetDebugDraw(debugDraw);
                }
                
                private function createBody(posX:Number,posY:Number):void 
                {
                        //1.创建刚体需求b2BodyDef
                        var bodyRequest:b2BodyDef = new b2BodyDef();
                        bodyRequest.position.Set(posX/ 30, posY/30);//记得米和像素的转换关系
                        //2.Box2D世界工厂更具需求创建createBody()生产刚体
                        body=world.CreateBody(bodyRequest);
                        //3.创建敢提形状需求b2ShapeDef的子类
                        var shapeRequest:b2PolygonDef = new b2PolygonDef();
                        //详细说明我们的需求
                        shapeRequest.density = 3;
                        shapeRequest.friction = 0.3;
                        shapeRequest.restitution = 0.2;
                        shapeRequest.SetAsBox(1, 1);
                        //4.b2Body刚体工厂根据需求createShape生产形状
                        body.CreateShape(shapeRequest);
                        body.SetMassFromShapes();
                        
                }
                
                private function createGround():void 
                {
                        //1.创建刚体需求b2BodyDef
                        var bodyRequest:b2BodyDef = new b2BodyDef();
                        bodyRequest.position.Set(stage.stageWidth/2 / 30, stage.stageHeight/30);//记得米和像素的转换关系
                        //2.Box2D世界工厂更具需求创建createBody()生产刚体
                        body=world.CreateBody(bodyRequest);
                        //3.创建敢提形状需求b2ShapeDef的子类
                        var shapeRequest:b2PolygonDef = new b2PolygonDef();
                        //详细说明我们的需求
                        shapeRequest.density = 0;
                        shapeRequest.friction = 0.3;
                        shapeRequest.restitution = 0.2;
                        shapeRequest.SetAsBox(stage.stageWidth/30, 1);
                        //4.b2Body刚体工厂根据需求createShape生产形状
                        body.CreateShape(shapeRequest);
                        body.SetMassFromShapes();
                }
                
        }

}



下载练习文件:
OK 2012-06-04 掉落的苹果——b2Body刚体.rar (508.54 KB, 下载次数: 23)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表