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

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

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 35】用PhysicsEditor快速创建自定义Box2D刚体(二)

[复制链接] TA的其它主题
发表于 2018-2-6 12:48:24 | 显示全部楼层 |阅读模式

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

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

x

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


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


上一节,我们认识了PhysicsEditor(后面称为PE)这么一个用来创建自定义Box2D刚体的工具,我们知道了他会自动生成一个PhysicsData.as类,通过PhysicsData的createBody()方法就可以轻松创建多边形刚体,今天我们就学习一下,如果使用PE来生成PhysicsData类,并应用到Flash中。

首先到PE的官网下载并安装这个软件,PE默认是试用版,开启后延迟激活,而限制只能创建由10以下刚体组成的多边形,不过对于我们学习来说,足够了。

安装好后,开启PhysicsEditor,看到的初始界面如下:

1.jpg
图1.PE开启后的界面

默认情况下,开启时编辑区是空白的,是没有拉登大叔的头像的,这一点说明一下啊!看到我做的标记了没?我们就按照这个顺序来看看PE怎么用。

点击1处的按钮,任意选择一张图片,尽量使用扣去背景色后存储为.png或.gif图片,因为这两种格式都支持透明像素,PE可以自动忽略透明像素。例如拉登大叔的头像其实是有背景的,扣掉背景后才有上面的效果。

图片添加成功后,会出现的3的位置,点击2处的按钮,可以删除已经添加了的图像。

添加完图片后,我们可以点击4处的按钮,让PE自动帮忙捕获图片的边缘,自动生成多边形顶点信息。当然也可以自己动手点击5或6位置的按钮,添加多边形或圆形组合成想要的效果。点击5处的按钮,默认会生成一个三角形,在任意两个顶点之间双击,可以添加新的顶点。相比之下,4处的按钮就简单多了,点击该按钮后会出现如图2所示的界面。

2.jpg
图2.点击6处的shape tracer按钮后,弹出对话框,PE自动追踪图像边缘

上图中的8处所示,是PE自动追踪图片边缘的效果。9处可以设置顶点之间的距离,这个值越小,顶点间距越小,多边形越接近图片的形状,同时消耗CPU也越多,所以不必过度要求多边形的精度,大体形状差不多就行。9处设置好后,PE会自动计算出顶点的个数,并显示在10处。

图2的对话框设置好后,点击OK按钮,返回到图1界面后,拉登大叔脑袋周围就出现了PE计算好的顶点,数数是不是跟10处显示的一样?

接下来我们再看看右边信息栏里的内容:

3.jpg
图3.多边形刚体创建好后,PE会在右侧显示出相关的信息

PE帮我们追踪完图片边缘后,右侧会显示该多边形的信息。11处是像素与Box2D中的m之间的比例,默认为32,但是我们一直用的都是30。12处是刚体的弹性、摩擦力、密度、isSensor信息,和b2Fixture里是对应的。13处是组成该多边形的子刚体的信息,每个刚体后面的选项是指碰撞过滤信息,Cat是指category刚体碰撞分组,Mask指刚体碰撞过滤,具体可以参考FilterData让Box2D碰撞分类进行这篇教程。


用同样的方法,我们还可以继续添加其他的图像,如下:
4.jpg
图4.添加多个图像
上面的步骤都完成后,选择图1中的7处为"Box2D ActionScript(Flash)",然后点击左上方的Publish按钮,就可以导出PhysicsData类了。
下面是我添加了3个图像之后的效果,点击舞台任意位置,随即创建3个图像的其中之一。



我生成的PhysicsData类如下:
[Actionscript3] 纯文本查看 复制代码
package
{
        import Box2D.Dynamics.*;
        import Box2D.Collision.*;
        import Box2D.Collision.Shapes.*;
        import Box2D.Common.Math.*;
    import flash.utils.Dictionary;

    public class PhysicsData extends Object
        {
                // ptm ratio
        public var ptm_ratio:Number = 30;

                // the physcis data 
                var dict:Dictionary;

        //
        // bodytype:
        //  b2_staticBody
        //  b2_kinematicBody
        //  b2_dynamicBody

        public function createBody(name:String, world:b2World, bodyType:uint, userData:*):b2Body
        {
            var fixtures:Array = dict[name];

            var body:b2Body;
            var f:Number;

            // prepare body def
            var bodyDef:b2BodyDef = new b2BodyDef();
            bodyDef.type = bodyType;
            bodyDef.userData = userData;

            // create the body
            body = world.CreateBody(bodyDef);

            // prepare fixtures
            for(f=0; f<fixtures.length; f++)
            {
                var fixture:Array = fixtures[f];

                var fixtureDef:b2FixtureDef = new b2FixtureDef();

                fixtureDef.density=fixture[0];
                fixtureDef.friction=fixture[1];
                fixtureDef.restitution=fixture[2];

                fixtureDef.filter.categoryBits = fixture[3];
                fixtureDef.filter.maskBits = fixture[4];
                fixtureDef.filter.groupIndex = fixture[5];
                fixtureDef.isSensor = fixture[6];

                if(fixture[7] == "POLYGON")
                {                    
                    var p:Number;
                    var polygons:Array = fixture[8];
                    for(p=0; p<polygons.length; p++)
                    {
                        var polygonShape:b2PolygonShape = new b2PolygonShape();
                        polygonShape.SetAsArray(polygons[p], polygons[p].length);
                        fixtureDef.shape=polygonShape;

                        body.CreateFixture(fixtureDef);
                    }
                }
                else if(fixture[7] == "CIRCLE")
                {
                    var circleShape:b2CircleShape = new b2CircleShape(fixture[9]);                    
                    circleShape.SetLocalPosition(fixture[8]);
                    fixtureDef.shape=circleShape;
                    body.CreateFixture(fixtureDef);                    
                }                
            }

            return body;
        }

        public function PhysicsData(): void
                {
                        dict = new Dictionary();

                        dict["ladeng6666"] = [

                                                                                [
                                                                                        // density, friction, restitution
                                            2, 3, 0.2,
                                            // categoryBits, maskBits, groupIndex, isSensor
                                                                                        1, 65535, 0, false,
                                                                                        'POLYGON',

                                            // vertexes of decomposed polygons
                                            [

                                                [   new b2Vec2(80/ptm_ratio, 82/ptm_ratio)  ,  new b2Vec2(0/ptm_ratio, 82/ptm_ratio)  ,  new b2Vec2(69/ptm_ratio, 62/ptm_ratio)  ,  new b2Vec2(80/ptm_ratio, 68/ptm_ratio)  ] ,
                                                [   new b2Vec2(64/ptm_ratio, 53/ptm_ratio)  ,  new b2Vec2(26/ptm_ratio, 26/ptm_ratio)  ,  new b2Vec2(29/ptm_ratio, 9/ptm_ratio)  ,  new b2Vec2(36/ptm_ratio, 1/ptm_ratio)  ,  new b2Vec2(56/ptm_ratio, 0/ptm_ratio)  ,  new b2Vec2(77/ptm_ratio, 24/ptm_ratio)  ,  new b2Vec2(77/ptm_ratio, 36/ptm_ratio)  ,  new b2Vec2(72/ptm_ratio, 52/ptm_ratio)  ] ,
                                                [   new b2Vec2(9/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(0/ptm_ratio, 82/ptm_ratio)  ,  new b2Vec2(4/ptm_ratio, 74/ptm_ratio)  ] ,
                                                [   new b2Vec2(77/ptm_ratio, 24/ptm_ratio)  ,  new b2Vec2(56/ptm_ratio, 0/ptm_ratio)  ,  new b2Vec2(67/ptm_ratio, 3/ptm_ratio)  ] ,
                                                [   new b2Vec2(29/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(9/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(12/ptm_ratio, 68/ptm_ratio)  ] ,
                                                [   new b2Vec2(0/ptm_ratio, 82/ptm_ratio)  ,  new b2Vec2(9/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(29/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(64/ptm_ratio, 53/ptm_ratio)  ,  new b2Vec2(69/ptm_ratio, 62/ptm_ratio)  ] ,
                                                [   new b2Vec2(26/ptm_ratio, 26/ptm_ratio)  ,  new b2Vec2(64/ptm_ratio, 53/ptm_ratio)  ,  new b2Vec2(29/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(23/ptm_ratio, 28/ptm_ratio)  ]
                                                                                        ]

                                                                                ]

                                                                        ];

                        dict["drink"] = [

                                                                                [
                                                                                        // density, friction, restitution
                                            2, 3, 0.2,
                                            // categoryBits, maskBits, groupIndex, isSensor
                                                                                        1, 65535, 0, false,
                                                                                        'POLYGON',

                                            // vertexes of decomposed polygons
                                            [

                                                [   new b2Vec2(13/ptm_ratio, 5/ptm_ratio)  ,  new b2Vec2(41/ptm_ratio, 28/ptm_ratio)  ,  new b2Vec2(34/ptm_ratio, 31/ptm_ratio)  ,  new b2Vec2(8/ptm_ratio, 11/ptm_ratio)  ,  new b2Vec2(8/ptm_ratio, 6/ptm_ratio)  ] ,
                                                [   new b2Vec2(13/ptm_ratio, 65/ptm_ratio)  ,  new b2Vec2(39/ptm_ratio, 62/ptm_ratio)  ,  new b2Vec2(14/ptm_ratio, 80/ptm_ratio)  ,  new b2Vec2(11/ptm_ratio, 72/ptm_ratio)  ] ,
                                                [   new b2Vec2(67/ptm_ratio, 169/ptm_ratio)  ,  new b2Vec2(58/ptm_ratio, 172/ptm_ratio)  ,  new b2Vec2(32/ptm_ratio, 172/ptm_ratio)  ,  new b2Vec2(23/ptm_ratio, 170/ptm_ratio)  ,  new b2Vec2(39/ptm_ratio, 62/ptm_ratio)  ,  new b2Vec2(47/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(77/ptm_ratio, 65/ptm_ratio)  ] ,
                                                [   new b2Vec2(39/ptm_ratio, 62/ptm_ratio)  ,  new b2Vec2(23/ptm_ratio, 170/ptm_ratio)  ,  new b2Vec2(14/ptm_ratio, 80/ptm_ratio)  ] ,
                                                [   new b2Vec2(41/ptm_ratio, 28/ptm_ratio)  ,  new b2Vec2(47/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(40/ptm_ratio, 57/ptm_ratio)  ,  new b2Vec2(34/ptm_ratio, 31/ptm_ratio)  ] ,
                                                [   new b2Vec2(47/ptm_ratio, 61/ptm_ratio)  ,  new b2Vec2(39/ptm_ratio, 62/ptm_ratio)  ,  new b2Vec2(40/ptm_ratio, 57/ptm_ratio)  ]
                                                                                        ]

                                                                                ]

                                                                        ];

                        dict["icecream2"] = [

                                                                                [
                                                                                        // density, friction, restitution
                                            2, 3, 0.2,
                                            // categoryBits, maskBits, groupIndex, isSensor
                                                                                        1, 65535, 0, false,
                                                                                        'POLYGON',

                                            // vertexes of decomposed polygons
                                            [

                                                [   new b2Vec2(44/ptm_ratio, 19/ptm_ratio)  ,  new b2Vec2(44/ptm_ratio, 70/ptm_ratio)  ,  new b2Vec2(38/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(30/ptm_ratio, 72/ptm_ratio)  ,  new b2Vec2(26/ptm_ratio, 71/ptm_ratio)  ,  new b2Vec2(25/ptm_ratio, 11/ptm_ratio)  ,  new b2Vec2(33/ptm_ratio, 6/ptm_ratio)  ] ,
                                                [   new b2Vec2(11/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(19/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(19/ptm_ratio, 97/ptm_ratio)  ,  new b2Vec2(11/ptm_ratio, 98/ptm_ratio)  ] ,
                                                [   new b2Vec2(3/ptm_ratio, 68/ptm_ratio)  ,  new b2Vec2(2/ptm_ratio, 19/ptm_ratio)  ,  new b2Vec2(11/ptm_ratio, 8/ptm_ratio)  ,  new b2Vec2(25/ptm_ratio, 11/ptm_ratio)  ,  new b2Vec2(26/ptm_ratio, 71/ptm_ratio)  ,  new b2Vec2(19/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(11/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(4/ptm_ratio, 71/ptm_ratio)  ] ,
                                                [   new b2Vec2(31/ptm_ratio, 98/ptm_ratio)  ,  new b2Vec2(30/ptm_ratio, 72/ptm_ratio)  ,  new b2Vec2(38/ptm_ratio, 73/ptm_ratio)  ,  new b2Vec2(38/ptm_ratio, 98/ptm_ratio)  ] ,
                                                [   new b2Vec2(25/ptm_ratio, 11/ptm_ratio)  ,  new b2Vec2(11/ptm_ratio, 8/ptm_ratio)  ,  new b2Vec2(17/ptm_ratio, 7/ptm_ratio)  ]
                                                                                        ]

                                                                                ]

                                                                        ];

                }
        }
}



主文档类的代码和上一节里的差不多,我就不再赘述了,具体请下载源文件查看。
OK 2012-12-16 用PhysicsEditor快速创建自定义Box2D刚体2.rar (399.12 KB, 下载次数: 1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /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)



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