一个弹幕解析器(2)-弹道描述文件

    上一篇简单的展示了下我的弹幕解析器。这一篇开始进入弹幕解析器的细节了。

    再次打广告,CSB项目的git地址在这里: http://git.oschina.net/zyf/CSB

    这次要说的是弹道文件是怎么规划的。

    弹道文件是以"csb"为扩展名的二进制文件。它里面包含了在CrazyStrom编辑器里面的“发射器”和“激光”两种元素的详细信息。

    csb文件是通过mbg2csb.py这个脚本讲CrazyStrom编辑生成的mbg文件转换得到的。脚本使用的是python2.7。

    常言道:一图胜千言.上图:

一个弹幕解析器(2)-弹道描述文件_第1张图片

    如上图是空白参数调用转换脚本将会输入的帮助内容。帮助说的比较明确了。

    python mbg2csb.py 附加参数列表 文件列表或目录就可完成转换。

    值得注意的是mbg2csb.py本身是utf-8编码存储的所以在windows平台默认的输出帮助内容或提示信息可能是乱码。

但是不影响正常的使用。

一个弹幕解析器(2)-弹道描述文件_第2张图片

    上图演示了默认转换是使用的小端字节序(对于大小端不了解的可能你需要去度娘了解一下。一般手机的arm芯片还有intel以及amd的cpu都是小端的)

    以及演示了如何通过-b参数控制大小端字节的输出.

    因为在脚本的生成阶段就把数据按照cpu的字节序排列好就可以免除在加载阶段的转换了。而且脚本实现这些要简单的多。

一个弹幕解析器(2)-弹道描述文件_第3张图片

    上图演示了如何递归的转换一个目录下的所有的需要转换的文件。

    考虑到可能在项目的某个资源路径下存在大量需要转换的文件,添加了递归查找并转换的-R参数。跟在-R参数后面的就是目录,而不再是文件列表了。

    图片中没有展示“文件列表”这个参数 形式。我在这写一下:

    python mbg2csb.py a1.mbg a2.mbg a2.mbg ......

    就是形如上面这样的转换方式。

    在csb文件中,只是对mbg中一些元素属性进行了筛选重排后写入的文件。

    文件的格式大概不是大家关心的。

    因为CSB项目还没有实现对激光的支持,所以mbg2csb.py中并没有添加激光的写入过程。当编辑出来的的mbg文件种包含激光的时候就会报错了。原因是我做这个的时候项目没有用到激光。也就没有做了。如果大家需要了,希望帮助扩展出来。

    可以从脚本的使用跳出来到libCSB中是如何加载生成的csb文件了。

    在libCSB的项目中存在一个测试用例,main.cpp。如果你也跟我一样是在linux上用的qtcreator操作的,那么你可以打开libCSB.pro修改头部的一段文本:

一个弹幕解析器(2)-弹道描述文件_第4张图片

一个弹幕解析器(2)-弹道描述文件_第5张图片

从上面的形式改成下面的形式。如果你不是linux不是qtcreator,那么你就需要根据你自己的开发环境自行配置。

无论怎样你都可以打开main.cpp查看源代码来了解使用过程。

看main函数的开头部分:

 /* first of all */
    COORD_CONFIG_VIEW_WORLD(800, 480);
    CSB_math_init();
    list_buf_init();
    csnode_buf_init();
    csobj_buf_init();
    /* then all tests */
    test_loadcsb();

    是的,在开始加载csb文件前,需要初始化好多东西.

    第一行有效代码是对视界初始化,定义了一个可视区域的大小。

    CSB_math_init()是对数学计算库的一些初始化。

    list_buf_init()这一行非常重要。list_t是CSB里面的核心容器结构。后面的篇幅讲介绍CSB的内存管理。

    接着也是一些必要的缓冲初始化。

    对于这篇博客,我们着重看一下test_loadcsb的实现:

    

static void test_loadcsb()
{
    printf("###############| test load csb |################\n");
    list_t* objlist = load_csb("good4.csb");
    if (!objlist) {
        printf("%s\n", csb_lasterr());
        return;
    }
    printf("load csb success, get %u obj \n", objlist->size);
    list_foreach(objlist, show_objdataname, NULL);
    list_free(objlist, (free_node_data)csobjdata_free);
}

    load_csb是在csb.h中声明的一个加载csb文件的函数。它的兄弟是: load_csbdata(unsigned char* pdata)

    他们都返回list_t*类型的一个包含该文件种所有的元素的链表结构指针。

    加载过程会伴有一大长串的日志,就不在这里贴了。具体运行就可以看到。

    objlist中的每个节点存储了一个csobjdata_t对象的指针。通过show_objdataname简单的便利了objlist打印了所有的csobjdata_t对象的名字。

    最后通过list_free将objlist释放内存。

    简单说无非就是:加载->使用->释放

    关于如何使用,后篇介绍。

    另外的在main.cpp中存在其它的测试,感兴趣的可以看看,并提出建议。也许你的测试例子的日志存在异常或者测试意外死亡。这是因为CSB在开发过程中有一次大的数据结构的变动,测试的例子代码没有更新。你可以尝试从git上pull最新的项目来解决问题。

    好了,以上就是这篇博客要整的内容。



你可能感兴趣的:(cocos2d-x,弹幕射击游戏,CSB)