很久之前就了解到Godot,因为前阵子研究Zircon mir3的代码所以心血来潮...
关键字:Godot, GDScript, zircon mir3, 游戏移植, ZL资源解析, NPC动画, 客户端资源复用

项目分析
项目说明
市场上传奇的引擎已经很成熟,本文章只是个人对Godot的熟悉了解为出发点,对于希望往传奇事业发展的朋友并不推荐。
新手上路
初识Godot与GDScript
两天时间熟悉Godot基础界面,轻量级体验良好。GDScript语法接近Python,学习曲线平缓,已掌握节点系统、信号机制等核心概念,为后续开发奠基。
尝试了GDScript 和 C# 两个版本的开发环境 编译速度和本着以学习为主的原因选择了 GDScript 至于性能,官方文档有提到过除了 C++ ,GDScript 和 C# 的性能主要差别在内存的消耗上,因为 GDScript 是手动回收内存,而 C# 是自动回收
ZL资源解压技术攻关
资源识别首日即遇阻。PackedByteArray.decompress方法参数理解偏差,多次尝试无果。Godot论坛发帖后迅速获解,需明确指定算法类型与缓冲区大小,问题迎刃而解。深刻体会到活跃社区的价值。
ZL资源、WZL资源的解析源码网络上都能找到
NPC动画资源成功加载
突破解压后,顺利读取客户端原始ZL动画包。通过自定义导入插件直接解析资源内的帧数据并构建Sprite2D动画,首个NPC已能播放待机/互动动画,标志移植进入实质阶段。
补充
之后发现热血传奇的WZL素材有阴影,效果看着更好,于是又花了些时间实现了WZL素材的解析。 虽然浪费了点时间,但没事主打一个折腾 😅
Area2D 初遇碰撞问题
NPC资源载入后需要实现鼠标交互,查阅官方文档发现 Area2D 很适合
类:Area2D
继承:CollisionObject2D < Node2D < CanvasItem < Node < Object 派生:NpcObject
2D 空间中的一个区域,能够检测到其他 CollisionObject2D 的进入或退出。
CollisionObject2D 能够容纳任意数量的 Shape2D 用作碰撞形状。每个形状必须分配给一个形状所有者
图片透明区域点击问题
因为WZL有阴影所以点击NPC区域的一些透明区域也会触发事件(ZL去掉了阴影),这里用了点击检测是否为透明区域的逻辑解决了问题
PCK包的尝试
考虑了从零开始整理素材的计划,首页要验证的是技术是否可行,查阅了资料发现Godot可以导出资源为PCK包。因为是自产自销,所以代码很容易就走通了。
不过因为没有太多时间去整理素材,所以技术先搁置着,用loadWZL的方式先把基础的一些功能实现了:blush:
最后
路远且艰,工作已经很多代码要敲了,兴趣就看心情吧 😎