FreeKill开发回顾

动机

首先要说一点,FreeKill本质上是接着太阳神三国杀新版框架(参见GitHub上的QSanguosha-new-framework)继续开发而成的。在cpp源码的网络通信这块,以及绝大部分QML界面,都大量的借用了它的代码,这也是FK必须用GPL3协议的原因。

在下决心开发FK之前,我做过别的方向的探索,就是用QSanguosha-v2的核心代码,缝合上QML的UI界面,以期实现QSanguosha的Qt版本更新。这个探索最终以失败告终。

不过在探索QSanguosha重构UI的时候积累了QML,所以开始打算开坑。

底层通信

直接抄呗,大抄特抄。不过他们的代码仍然有Bug,在调试的时候令人想死

UI

最开始都是抄的,好在自己开始慢慢看得懂了,现在想怎么拓展怎么拓展

游戏逻辑

这块就完全没抄的了,最后决定是用Lua实现游戏逻辑。

最开始的时候,打算Client里面一个lua_State,Server里面一个lua_State,Server的lua_State同时多线程跑很多Room。

于是Server大炸特炸,故改为每个Room(一个Room就是一个线程)一个lua_State。看起来还不错

对于Lua代码的执行,从神杀照抄了DoLuaScript(基本上就是在指定的L里面执行dofile函数)。这也就是说,DoLuaScript可以视为Lua程序的入口。在双端都先执行freekill.lua,然后根据Client和Room,分别执行不同的Lua

初次执行Lua并不跑起来代码,只是算是初始化而已。自此,Client的Lua在大部分时间都在睡觉,偶尔处理一下服务端的消息;服务端则基本一直是忙碌的,从Room::start开始就没闲过。当主函数返回时,Room线程也随之返回,然后被销毁掉。

freekill.lua做了啥?

如同其注释,它是初始化整个游戏引擎用的,具体而言就是从文件中加载了一堆类之类的东西,最后实例化Engine到全局变量Fk中。Engine的构造函数中,loadPackages就加载了所有包。

loadPackages的内容大概就是去packages下面找各种init.lua,找到就读取。然后里面还写死了先加载两个标包。

freekill.lua在实例化Engine之前还先读取了fk_ex,lua。这个文件实际上就是对标神杀Lua的,纯属对神杀的情怀,实际上这个文件就算删了问题也不大,不过已经形成规范了就算了(我本来还指望靠这样多拉一点神杀luaer来,结果拉到了不少无名杀js作者,总有点感觉苦心白费了

读了fk_ex之后就能正常加载包了。包里面就是一堆武将卡牌之类的东西罢了

更多的详见dev/doc吧,摆了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容