您的位置:首页 > 运维架构

custom properties and using exported date of rube

2013-09-15 17:25 507 查看

用户自定义的特性:

有的时候你想更物理对象更多的信息,可以把这些信息做为用户自定义特性加到一个物体类,然后就跟前面的一样设置这个特性的值。下面的类可以增加用户特性:

1.刚体

2.夹具

3.关节

4.图片

5.世界

一个用户自定义的特性可以是整型、浮点型、字符串、向量或者布尔型。

用户自定义的特性以***显示在特性栏里面,用户自定义特性保存在.rube场景文件里面,所以每个场景文件包含一个用户自定义特性集

创建用户自定义的特性:

在[场景设置对话框],用户自定义特性可以被创建、编辑和删。

为了增加一个新的特性,你应该指定特定的类、类型、名字和显示的名字。类指定了它属于哪种物理特性,而类型则指定了用户特性类型。

名字是一个用户自定义特性的简写,它可以做为一个脚本可用的字符串,这也意味着它只可以含有字母。这个名字可以用来在脚本中访问这个用户自定义特性,而且可以导出

JSON原始数据文件。

你可以撤消/重写所有的用户自定义的操作:创建、编辑和删除。只有一点需要注意的是:每个独立的改变都对应一个撤消操作,并且这种变化会马上生效,即使[场景设置对话框]都是打开的状态。比如,如果你打开[场景设置对话框],并且增加了三个特性,当你关闭了对话框之后,你需要撤消三次去反转这个操。如果你有疑问,你可以去[编辑菜单]下面去看看撤消操作的文字说明。

管理用户自定义的特性:

凡是在[场景设置对话框]里面可以编辑的特性,都可以用脚本来完成,下面还有些全局脚本函数用来创建和修改用户特性:


bool addCustomProperty(string class, string name, string displayName, string type);
    bool removeCustomProperty(string class, string type);
    bool setCustomPropertyNames(string class, string oldName, string newName, string newDisplayName);

你可以用下面的函数来查询单个的物体里面的用户自定义特性:(其中物体包含世界、刚体、夹具、关节和图片)
string[] item::getCustomProperties();
    string   item::getCustomPropertyType(string name);
    bool     item::hasCustomProperty(string name);


你可以设置、得到或者清理单个的物体的用户自定义特性,只要熟悉下面的这些函数就可以了:

void item::setCustomInt(string name, int val);
    void item::clearCustomProperty(string name);
    int  item::getCustomInt(string name);



使用导出的数据:

为了导出一个适合你自己的应用程序使用的格式,你只需要选择[导出场景]-〉[保存原始信息],这样就会导出一个.json文件,这个文件保住所有的可用物理世界信息,但是这个导出文件跟R.U.B.E自己使用的文件有细微的区别。

要使用R.U.B.E编辑的物理世界,就要求你的程序可以一个JSON加载器,当前有三种语言可以加载JSON文件,分别是C++、J***A和J***ASCRIPT

你可以在sampleLoaders文件夹里面找到一个应用这些语言的例子

支持的加载器:

因为我只会C++,所以我只翻译C++的部分:

C++使用b2dJson来加载R.U.B.E的导出文件,在网上有完整的使用指南,并且在sampleLoaders/box2d-testbed-(c++)文件夹下面有一个完整的例子。

下面是一些基本的用法:

为了加载box2d世界,你需要一些库文件去解析JSON和b2dJson文件,这里面总共7个文件,你可以在sampleLoaders/box2d-testbed-(C++)文件夹下面找到

下面是图示文件:




为了加载这个场景,你必须包含b2dJson.h这个头文件。用readFromFile加载一个你导出的文件去创建一个b2dJson实例,如果这场景没有被加载,这个函数会返回null:

b2dJson json;
    string errorMsg;
    b2World* world = json.readFromFile( "rubeRawInfoOutput.json", errorMsg );
    if ( ! world )
        printf("Could not load JSON file : %s\n", errorMsg.c_str());


有关json的更多细节,可以访问下面的链接:http://www.iforce2d.net/b2djson/

加载图片:

导出的数据不仅包括物理世界,同样也包括里面的图片信息。b2dJsonImage类包含了每张图片信息,在导出文件加载成功后,你可以得到一系列的图片信息,这些图片信息以渲染次序来排序:

vector<b2dJsonImage*> images;
    json.getAllImages(images);

加载用户特性,当加载了一个场景到你的程序中后, 你可以访问用户自定义的特性信息。主要的方法是:通过用户自定义的特性信息得到物体,或者通过一个物体得到它的用户自定义的特性信息。

你可以能过给getXXXByCustomYYY()给定特定的值来得到一系列的匹配物体,XXX部分可以是刚体、夹具、关节或者图片。YYY部分可以是int, float, string, vector or bool。例如:



vector<b2Body*> enemies;
    json.getBodiesByCustomString("category", "enemy", enemies);

当然也可以只获取单个物体,例如:

b2Fixture* f = json.getFixtureByCustomInt("damage", 5);


保存和导出的区别:

R.U.B.E的场景文件和导出的原始信息文件都是JSON格式的扁平文本,它们的基本结构大体上是相似的,但是主要的不同的地方是一些场景部分的保存,这部分就解析这些不同点,而且它们最主要的不同点是在于夹具的表现:
当为box2d定义一个多边形时,它们必须是凸多边形,并且最多只有逆时针方向上8个顶点,做为对比,RUBE允许你不考虑这些烦人的规定,而且RUBE允许你切换下面几个状态:多边形、线条和循环类型,并且可以为所有的类型设置半径,为了说明RUBE文件和原始信息文件之间的差别,我们用下面的例子来做说明:
在RUBE文件里面,它保存为六个顶点,而在JSON文件里面,它就以三个独立的夹具来保存。

JSON文件数据结构:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐