LDEasyNape vs LDEasyBox2D

作者: ladeng6666 分类: Nape 发布时间: 2013-02-20 22:38 阅读: 3,980

大家都知道LDEasyBox2D可以帮我们简化Box2D应用的创建过程。近期拉登大叔也在研究Nape,虽说Nape的用法比Box2D要简单不少,但是用惯了LDEasyBox2D,还是觉得有点繁杂,所以拉登大叔也写了一个LDEasyNape。

与此同时也对LDEasyBox2D做了一些修改,统一了LDEasyNape和LDEasyBox2D的函数,可以用相同的方法创建Nape或Box2D方法。闲话少说,我们来看看具体的用法。

大体的步骤如下:

  1. 用initialize(stage:Stage,napeFps:uint=60)方法设置LDEasyNape引用的Flash舞台对象,以及模拟帧频(默认为60)。
  2. 用createDebug()方法创建模拟视图,同时将返回的BitmapDebug对象的display属性添加到舞台上。
  3. 利用createCircle、createBox、createRegular等等方法快速创建刚体
  4. 在EnterFrame事件处理函数中调用updateWorld()更新Nape空间模拟。

另外和以前的LDEasyBox2D一样,我们还可以用getBodyAtMouse()方法获取鼠标位置处的刚体,用startDragBody和stopDragBody方法开始或停止拖动刚体。

依然很简单,不过在使用时不用再设置stage等其他属性了,接口更加简化了,相同的方法可以用在LDEasyBox2D和LDEasyNape上,同一了两个物理引擎的用法。下面是LDEasyBox2D和LDEasyNape在Google Code上是地址,你可以在这里获得的最新的LDEasy类。

LDEasyBox2D:http://code.google.com/p/ldeasybox2d/

LDEasyNape:http://code.google.com/p/ldeasynape/

除了统一了这两个类之外,我还自定义了一个LDEasyUserData类,同样都适用于LDEasyBox2D和LDEasyNape。LDEasyUserData中有两个公共方法setGraphicAuotmatically和setGraphic,它们的用法如下:

  • setGraphicAuotmatically:通过这个方法的参数可以快速设置由单色填充的自定义刚体视图
  • setGraphic:设置开发者自定义的刚体视图

然后在创建刚体的createCircle、createBox、createRegular等方法的最后一个参数中设置LDEasyUserData对象,快速创建自定义视图。

同时LDEasyUserData也是一个动态类,使用时你可以随意添加新的属性。下面是Nape贴图里的示例用LDEasyNape和LDEasyUserData实现的代码,看,是不是简单了许多?

下面的示例中,同时Box2D和Nape创建了刚体,红色刚体是Box2D的,蓝色是Nape的,鼠标点击可以拖动刚体。

Sorry, either Adobe flash is not installed or you do not have it enabled

代码中,我定了createNapeWorld()和createBox2DWorld()两个方法,分别创建Nape和Box2D的应用,对比一样,基本都是一样的,代码很简单,我就不逐一解释了,大家直接看代码吧!

点击这里下载完整的源文件

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

3条评论
  • Pingback: Nape刚体碰撞检测 « Ladeng6666-专业的Flash/AS3爱好者
  • zhangandi

    2013 年 6 月 14 日 下午 4:03

    拉登叔,在您的这个DEMO中,拖动NAPE物体时,debugdraw的边框与贴图会出现不同步的情况。

    在LDEASYNAPE.AS 中154行

    public static function updateWorld():void{
    for(var i:int=0; i<world.liveBodies.length;i++){
    var body:Body=world.liveBodies.at(i);
    var graphic:DisplayObject=body.userData.graphic;
    var position:Vec2=body.position;
    if(graphic!=null){
    graphic.x=position.x;
    graphic.y=position.y;
    graphic.rotation=(body.rotation*180/Math.PI)%360;
    }
    }

    world.step(1/LDEasyNape.napeFps);
    if(napeDebug!=null){
    napeDebug.clear();
    napeDebug.draw(world);
    napeDebug.flush();
    }
    if(hand!=null){
    if(hand.active) hand.anchor1.setxy(stage.mouseX,stage.mouseY);
    }
    }

    nape的贴图部分与debug部分被 world.step(1/LDEasyNape.napeFps); 隔开了,导致贴图总比debug慢一帧。

    1. ladeng6666

      2013 年 6 月 27 日 下午 6:20

      实际游戏中,不显示调试视图就可以了!

发表评论

电子邮件地址不会被公开。 必填项已用*标注