首页 > 代码库 > Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)

Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)

继续我们的问题,如果遇到不规则的图形怎么办?难不成要一个个组装吗?

这里就要提一个叫做“关节”的名词了,它可以将一个个部分进行组装成自己的形状,特别是各部件独自运转时,比如一辆自行车,它的轮子和车身都是各自运转的。

但是网上相关的资料真是太少了!一大堆复制粘贴的,全是废话,不知道大家是怎么感觉的?但是我的这个游戏没用到,所以没有深究,有兴趣的可以去谷歌一下。

下面我介绍的是一个非常非常方便的工具,它的名字叫做physics-body-editor,那么它是干什么的呢?恩,它可以根据你的图片创造你想要形状(凸多边形)的body!比如你有一张杯子的图片,你想要得到一个和它一样形状的body,那么你就可以使用physics-body-editor

这是它的官网http://www.aurelienribon.com/blog/projects/physics-body-editor/,(需要越狱,建议使用自由门软件越狱)

这是一名美国大牛业余时间写的,不得不说外国人真的很用心,相比之下,国内就显得特别浮躁。很少有几个用心写博客,写评论的,对自己写的也很不负责。

那么我先介绍一篇国内也是唯一一篇介绍这个工具的博客(我是第二个,咳咳……)

http://www.huangyunkun.com/2012/08/29/libgdx_24/  

我看到了好多一模一样的,好像这个才是原创,哎,就算借鉴也不用一模一样吧,整的跟自己用过似得。读完他这篇博客我发现学到的还没有官网上多。。。而且我还是没明白怎么使用,官网上并没有相关的完整下载包。。。

好了,我就先给大家翻译一下官网上的内容:

Introduction


物理身体编辑器是所有关于你的生活与物理引擎更容易。具体地说,它的目标,你的游戏物体的碰撞创造形态:我们称之为刚体。它也可以让你把这些对象在一起并与接头连接创建复杂的对象:我们称之为动态对象。

我们要解决的问题是:对在图像看,我想创造一瓶可以保持对象里面。首先,我用绘图工具绘制图像的形状在瓶我点,我报告的值在我的游戏。对于每一个点,我不得不从像素单元转换为当然世界单位。无聊的。哦,你猜怎么着?它不工作!事实上,物理引擎通常只与凸多边形!在分解为多个凸多边形的形状,用手……多无聊。当然,每一次我想做一个小小的变化,我不得不去同一过程。
我想你明白为什么这样的自动工具可以方便的:它将像素单位世界单位,分解为多个凸多边形的形状,并让你的测试结果直接!

Features

  • 自动分解为凸多边形的凹形状,
    自动跟踪您的图像,如果需要的话,
    支持一个单体多了,
    支持多边形和圆的形状,
    参考点的位置是可以改变的,
    与网格对齐选项可视化组态网格,
    建立在碰撞测试仪!掷球在你的身体测试,
    对于游戏机都提供的框架,
    简单的输出格式(JSON),让你创造你自己的任何语言的任何框架装载机。

Download

The latest version of the application can be downloaded from its project page. As it is written in Java, it should be working under Windows, MacOS and most Linux distributions.

Project repository:
http://code.google.com/p/box2d-editor/

Download page (application, loaders and demos):
http://code.google.com/p/box2d-editor/downloads/list

The application uses the following technologies:

  • LibGDX, the most awesome game dev library, for the rendering of the canvas area,
  • Box2d, as the embedded physics engine (available in Java thanks to libGDX),
  • Farseer engine, for its auto-trace and polygon decomposition algorithms.

Application Manual

Get started quickly!

Here is a video tutorial to get you quicky up and running. It shows how to create a project, how to add a new body, and how to define its collision shape. The video quality is not awesome at all (sorry about that), so don’t look at it to appreciate the user experience of the application but only to learn the basic commands.

[youtube=http://www.youtube.com/watch?v=KASY91EiTXQ]

Polygons and circles

有两种形状:可以被创建和界定。在创建一个多边形的形状,你要做的是创建和启用的模式,点击任何地方在屏幕上。点击Add将每个点的多边形,和当你想关闭它,只要点击在第一点。在创建一个圆,你需要按住Ctrl键或C,然后点击一次来设置在中心的形状,第二次定义了它的半径。

Keyboard shortcuts

Several keyboard shortcuts exist to make your life easier:

  • TAB 切换 创建编辑和测试三种模式
  • BACKSPACE 删除选定的点(只有编辑的时候才可以删除)
  • ENTER 插入选定的新点之间
  • ESC 你关闭它之前取消一个形状的创造

Auto-trace

该工具支持自动跟踪功能可以帮助您在许多场合练习一点。自动跟踪算法通常远比你的手不太精确,但少数的细化步骤,您可以创建复杂的形状,很快。
自动跟踪功能仅可在没有现有形状先前定义的,如果图像是你的身体有关的。它在图像的alpha通道的作品,并以4参数。船体公差定义如何你想你的图像轮廓应遵循(较高的值意味着低精度)。0和255之间的公差范围,定义了一个坚实的像素和一个空的像素之间的极限。当被激活时,多部分的检测将试图跟踪多个形状,和孔的检测将检测图像中的一个洞。这两个成功的最后一个选项是没有保证的。

Reference point

在物理身体的编辑器,您定义的每个图像的身体,这个身体是由多个灯具。夹具是基本形状(多边形或圆形)的一些相关的参数,如密度和摩擦。体位于世界上一个点,称为参考点。其夹具放置在参考点。请注意,这个参考点无关,其质量中心。事实上,你身体的旋转点是它的质量中心。基准点的物理模拟没有影响。它仅仅是一个方便的点到你身体的位置相对于这个参考点。这是它的物理引擎的理论。
默认情况下,一个物体的参考点在左下角及其相关的图像。这意味着,当你在游戏世界中的主体地位,其设备都会在正确的位置。你可以把这个参考点在物理身体编辑版模式:它是一个圆形的红十字会。

Loader and game objects

注意:下面的代码片段从装载机都演示项目提取。他们是写在Java,和目标都游戏框架。然而,他们应该很容易理解,并易于移植到其他语言。
有两个重要的东西,当你想用你的项目在你的游戏文件:(1)安装夹具,你的身体,和(2)在适当的位置绘制相关的图像。物理引擎,体模型:他们不相关,你将如何使他们在屏幕上的所有。看到我的模型之间的分离,使理解教程。

第一步是容易的,所提供的装载机为你做一切事情。请注意,在7行的位置对应的世界,身体的位置的参考点。在这里我们将它在世界坐标(0,0)。

privatevoid createBottle() {
    // 0. Create a loader for the file saved from the editor.
    BodyEditorLoader loader = newBodyEditorLoader(Gdx.files.internal("data/test.json"));
 
    // 1. Create a BodyDef, as usual.
    BodyDef bd = newBodyDef();
    bd.position.set(0,0);
    bd.type = BodyType.DynamicBody;
 
    // 2. Create a FixtureDef, as usual.
    FixtureDef fd = newFixtureDef();
    fd.density = 1;
    fd.friction = 0.5f;
    fd.restitution = 0.3f;
 
    // 3. Create a Body, as usual.
    bottleModel = world.createBody(bd);
 
    // 4. Create the body fixture automatically by using the loader.
    loader.attachFixture(bottleModel,"test01", fd, BOTTLE_WIDTH);
}


现在,我们有我们的模型完全建立,我们要在它的位置画出相应的图像。都把图像与参考他们的左下角。因此,如果你离开参考点在左下角的你的身体,你可以直接把图像的参考点的位置(用getposition()方法Box2D引擎返回)。否则,如果你改变参考点的位置,你需要考虑绘制图像。

因此,你需要存储供以后使用的参考点:

bottleModelOrigin = loader.getOrigin("test01", BOTTLE_WIDTH).cpy();


最后,在你的渲染方法,你可以参考点的位置绘制图像,它的局部坐标系偏移相对于图像的左下角:

publicvoidrender() {
    Vector2 bottlePos = bottleModel.getPosition().sub(bottleModelOrigin);
 
    bottleSprite.setPosition(bottlePos.x, bottlePos.y);
    bottleSprite.setOrigin(bottleModelOrigin.x, bottleModelOrigin.y);
    bottleSprite.setRotation(bottleModel.getAngle() * MathUtils.radiansToDegrees);
 
    ...
}


That’s all, you should now be up and running!


怎么样?看完以后是不是觉得比那个博客要详细?好了,如果你有耐心看完那么你基本了解这个工具的使用方式了,但是,面对一个新的事物,可能新手的理解方式和已经会的人的理解方式不同,可能你还是不会使用它,所以对于学习新东西,我觉得源码+博客才是最佳的方式。由于老外提供的源码不是一个完整的项目,还说有一些包需要自己导入,真是的,谁知道怎么导入!特别是新手,对吧!那么我就附上最完整的项目源码供大家参考:http://download.csdn.net/detail/u011747781/8159783这里我要提一下,经过我实验发现其实并不需要导入什么包,只需要把那个BodyEditorLoader类加入项目即可,要运行官网例子需要导入tween-engine-api.jartween-engine-api-sources.jar,这两个貌似是他写的管理类,如果你的项目不需要那么可以去掉它!


如果你看了那个网站下面的评论或者自己创建项目导入包,那么你会发现一个问题:
the Exception in thread “LWJGL Application” com.badlogic.gdx.utils.GdxRuntimeException: java.lang.NoSuchMethodError: com.badlogic.gdx.utils.JsonReader.parse(Ljava/lang/String;)Ljava/lang/Object;

这个问题是作者的一个疏忽造成的,导致好多同志用不了这个工具,我也纠结了两三天才解决,期间我逛了无数国内外网站论坛,终于找到了一种方法!结果在我这还不对!……当时就觉得有一万个草泥马了……最后终于在一位老外的回复中受到了启发。
原来这个问题的原因就是这个工具使用的JASON的API和libgdx的JASON的API不对应导致的!经过我的实验发现,这个工具支持libgdx0.98及其以下版本,也就是说你要用0.98版本或者比它低的版本开发才能使用这个工具,这个BUG至今作者还没有修复,可能很忙吧……希望大家引以为戒!

好啦,基本就是这些,赶紧下载去享受它为你带来的便利吧!



Libgdx Box2D实战---放开那小球(四:不规则body创建--physics-body-editor的使用)