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

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

[2D 物理引擎] 【9RIA—ladeng6666】—【Box2D系列教程 追加篇】LDEasyBox2D 3.0

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

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

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

x
本帖最后由 TKCB 于 2018-2-6 14:47 编辑

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


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



在运行时创建多边形刚体教程中,我们学会了创建多边形刚体,又在[Box2D]多边形刚体贴图中学习了如何为多边形刚体贴图,不过多边形刚体创建和贴图的过程还是稍有复杂,所以我把它集成到了LDEasyBox2D.createPolygon()方法中。

下面我们来看一下LDEasyBox2D.createPolygon()的用法

[Actionscript3] 纯文本查看 复制代码
                /**
                 * 根据一组顶点数据,创建多边形刚体,可以是顺时针绘制,也可以逆时针绘制,但不能出现交叉
                 * @param        world Box2D世界
                 * @param        vertices 顶点数组,顶点之间不能有交叉
                 * @param        isStatic        是否为静止的刚体
                 * @param        fillData        刚体的填充纹理,一个BItmapData对象,请确保整个BitmapData的尺寸大于舞台的尺寸
                 * @param        stage        添加userData的舞台
                 * @return 返回一个多边形刚体
                 */
                public static function createPolygon(
                                world:b2World,
                                vertices:Vector.<b2Vec2>,
                                isStatic:Boolean = false,
                                fillData:BitmapData = null,
                                stage:DisplayObjectContainer = null
                ):b2Body


我用LDEasyBox2D创建了[Box2D]多边形刚体贴图中的实例,效果是一样的,但是代码精简了很多。


完整代码和注释:
[Actionscript3] 纯文本查看 复制代码
package
{
 
        import Box2D.Common.Math.b2Vec2;
        import Box2D.Dynamics.b2World;
 
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
 
        /**
         * [url=http://www.ladeng6666.com]http://www.ladeng6666.com[/url]
         * @author ladeng6666
         */
        public class MainWithSeparatoEasy extends Sprite
        {
                private const segmentLength:Number = 20;
 
                private var world:b2World;
                //绘制图形的画布
                private var spriteCanvas:Sprite;
                //绘制图像的纹理
                private var woodBmd:BitmapData = new Wood();
 
                private var prePoint:Point = new Point();
                private var curPoint:Point = new Point();
 
                private var verticesList:Vector.<b2Vec2> = new Vector.<b2Vec2>();
 
                private var isDrawing:Boolean = false;
                public function MainWithSeparatoEasy()
                {
                        //创建box2D世界
                        world = LDEasyBox2D.createWorld();
                        //创建box2D调试图
                        addChild(LDEasyBox2D.createDebug(world));
                        //创建地面
                        LDEasyBox2D.createWrapWall(world,stage);
 
                        spriteCanvas = new Sprite();
                        addChild(spriteCanvas);
                        //侦听事件
                        addEventListener(Event.ENTER_FRAME, loop);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);
                        stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove);
                }
 
                private function onStageMouseMove(e:MouseEvent):void
                {
                        //如果鼠标没有按下,isDrawing为false,跳出
                        if(!isDrawing) return;
                        spriteCanvas.graphics.lineTo(mouseX, mouseY);
                        //记录鼠标坐标为当前curPoint,并计算curPoint与上一个点prePoint的距离
                        curPoint = new Point(mouseX, mouseY);
                        var distance:Number = Point.distance(prePoint, curPoint);
                        //当前后两个点的距离大于线段距离时,添加顶点
                        if (distance >= segmentLength) {
                                //记录顶点到verticesList数组中
                                verticesList.push(new b2Vec2(mouseX / 30, mouseY / 30));
                                prePoint = curPoint.clone();
                        }
                }
 
                private function onStageMouseUp(e:MouseEvent):void
                {
                        //鼠标弹起后,停止绘制
                        isDrawing = false;
                        //画布里的内容
                        spriteCanvas.graphics.clear();
                        //在鼠标位置随机创建一个多边形刚体
                        //之前的createPolygon和createUseData被集成到了LDEasyBox2D.createPolygon
                        LDEasyBox2D.createPolygon(world, verticesList, false,woodBmd,stage);
 
                        //清空存储顶点的Vector数组
                        verticesList = new Vector.<b2Vec2>();
                }
                /**
                 * 鼠标按下事件侦听
                 * @param        e
                 */
                private function onStageMouseDown(e:MouseEvent):void
                {
                        //鼠标按下后,开始绘制
                        isDrawing = true;
                        //设置线条样式
                        spriteCanvas.graphics.lineStyle(2);
                        spriteCanvas.graphics.moveTo(mouseX, mouseY);
 
                        //定义鼠标点为起点
                        curPoint = new Point(mouseX, mouseY);
                        prePoint = curPoint.clone();
 
                        verticesList.push(new b2Vec2(mouseX / 30, mouseY / 30));
                }
                /**
                 * 刷新屏幕
                 * @param        e
                 */
                private function loop(e:Event):void
                {
                        LDEasyBox2D.updateWorld(world);
                }
        }
 
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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



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