rayxuln / spine-runtime-for-godot

This project is a module for godot that allows it to load/play Spine skeleton animation.
MIT License
93 stars 22 forks source link

3.8分支版本的建议 #52

Open blackier opened 2 years ago

blackier commented 2 years ago
1、

3.8版本我个人用的是v3.8.75的spine,分支编译出来后的godot添加模型完成没响应,最后看报错,在官方的代码里找到了原因,一共有两处: SkeletonJson.cpp132

    skeleton = Json::getItem(root, "skeleton");
    if (skeleton) {
        skeletonData->_hash = Json::getString(skeleton, "hash", 0);
        skeletonData->_version = Json::getString(skeleton, "spine", 0);
        // if ("3.8.75" == skeletonData->_version) {
                //     delete skeletonData;
                //     setError(root, "Unsupported skeleton data, please export with a newer version of Spine.", "");
                //     return NULL;
                // }
        skeletonData->_x = Json::getFloat(skeleton, "x", 0);
        skeletonData->_y = Json::getFloat(skeleton, "y", 0);
        skeletonData->_width = Json::getFloat(skeleton, "width", 0);
        skeletonData->_height = Json::getFloat(skeleton, "height", 0);
        skeletonData->_fps = Json::getFloat(skeleton, "fps", 30);
        skeletonData->_audioPath = Json::getString(skeleton, "audio", 0);
        skeletonData->_imagesPath = Json::getString(skeleton, "images", 0);
    }

SkeletonBinary.cpp129

    char *skeletonData_version = readString(input);
    skeletonData->_version.own(skeletonData_version);
        // if ("3.8.75" == skeletonData->_version) {
        //     delete input;
        //     delete skeletonData;
        //     setError("Unsupported skeleton data, please export with a newer version of Spine.", "");
        //     return NULL;
        // }

    skeletonData->_x = readFloat(input);
    skeletonData->_y = readFloat(input);
    skeletonData->_width = readFloat(input);
    skeletonData->_height = readFloat(input);

如果你用的也是3.8.75导出的模型,那么你编译时就需要把上面对版本的判断去掉,否者模型是不能加载的。奇怪的是官方就只针对3.8.75,强制更新也该是小于某个版本才对,原因估计就是我为什么能在用3.8.75吧。我对比了官方加了这个限制的前和后的提交对比,数据解析这块看起来是没太大改动,所以去掉也应该没事吧,我也说不准,我去掉后重新编译是可以正常加载模型了。

2、

两处代码修改参考:

// SpineAtlasResource.cpp -> load_from_atlas_file
···
    CharString atlas_data_utf8 = atlas_data.utf8();
    atlas = new spine::Atlas(atlas_data_utf8, atlas_data_utf8.length(), source_path.get_base_dir().utf8(), new RaiixSpineTextureLoader(&tex_list, &ntex_list, normal_texture_prefix));
···

值得注意转换过后sizelength是不同的。

#ifndef SPINE_RUNTIME_REGISTER_TYPES_H
#define SPINE_RUNTIME_REGISTER_TYPES_H

void register_spine_runtime_types();
void unregister_spine_runtime_types();

#endif // SPINE_RUNTIME_REGISTER_TYPES_H

这个说实在的,在看到没加时我是有点吃惊的,但看到其他文件都加了,我觉得应该是遗漏了,哈哈。

3、

最后最后,关键的一点,我希望能用godot官方的代码格式化配置,格式化源文件,godot项目根目录下就有.clang-format文件,如果本地仓库就在godot的仓库下,那么直接用clang-format格式化就会按配置里的来,如果不在godot的仓库,那么拷贝出来一份放到自己仓库里来就行了。需要注意的是,godot官方用的是v13的clang了,如果格式化时配置参数不支持,那么你就需要更新你的clang版本才行,我用vscode做格式化时就遇到了这个问题,c++扩展自带的版本太低了,然后安装v13版本clang自定义配置clang-format的路径才正确格式化。这个其实挺必要的。

这两天忙活基本都在忙活这个,挺有意思也挺花精力的,佩服作者能写这个项目出来,这个需要都熟悉godot和spine才行,还会c++,英语还好,那些官方文档我看的头疼。godot我也是这两个月才接触的,业余才有时间学下,现在都没入门,想加下群的,但估计和群主游戏爱好不同吧,申请了就没反映了,随缘了。pr是真的不想提了,只能在这写这几点建议,也是想让自己这两天不要白忙活,算是做点小小贡献了。

格式化那点真的希望能采纳下!

rayxuln commented 2 years ago

十分感谢你的建议

rayxuln commented 2 years ago

q群只要是填写了游戏的就能进了的,我估计是管理员开小差了。 稍等我把管理员踢了泄愤

pytomtoto commented 8 months ago

链接:https://pan.baidu.com/s/1uqymaUvAlO91Ubm3QI-vUg 提取码:godo

q8135434 commented 6 months ago

链接:https://pan.baidu.com/s/1uqymaUvAlO91Ubm3QI-vUg 提取码:godo

大佬,我不会c++,但是我看到有个spine的平替龙骨软件,它有个插件c++的支持godot4以上,大佬能否去看看把它编译过来