Grogue游戏开发日志

cover

Grogue现在可在线游玩!
目前处于Demo状态,每周日更新

2023.7.17

游戏内容更新

代码更新

这一个月在做四个事情:

  • 重写静态反射框架
  • 使用静态反射框架自动化生成lua绑定代码
  • 使用静态反射框架自动生成序列化/反序列化代码
  • 使用libclang解析所有头文件并生成序列化代码

做完这些事情后,再也不需要手动实现一大堆反射/绑定/序列化代码了。除此之外,游戏内容没有任何改变,相当于大型重构了一次。

2023.6.25

游戏内容更新

  • 修改了人物的移动速度,不会一直加速
  • 现在背包内的物品可以堆叠

代码更新

  • 使用跨平台的输入类Input,可同时处理PC和移动端(移动端未实现)的按键/虚拟按键输入,并从配置文件中读入按键类型。
  • 将部分UI配置移入配置文件中
  • 尝试编写更加完善的物理引擎

2023.6.18

游戏内容更新

  • 场地上的建筑物和人物有物理碰撞

代码更新

增加了一小部分的物理系统,让人物可以和建筑物之间进行碰撞

2023.6.11

游戏内容更新

代码更新

主要增加了自动化解析C++头文件,并且生成Lua绑定代码的工具:

  • 新增四个宏:
    • LUA_BIND:绑定普通函数/类
    • LUA_BIND_RESOURCE:绑定资源类
    • LUA_BIND_COMPONENT:绑定组件类
    • LUA_NOBIND:不做绑定,当使用以上三个宏时,对任意成员定义此宏将取消绑定
  • Parser工具:
    • 使用python+robotpy-cppheaderparser分析C++头文件,并且自动生成绑定代码于luabind/下(完成)和自动生成Lua定义文件(进行中)

2023.6.8 重启Grogue

Grogue是一个从2021年起开始编写的RogueLite游戏,大致经历了三个阶段:

  • Roguelike阶段: 在2021年4月初的时候,还在读书的我萌生出了”编写我自己的Roguelike游戏“的想法。当时的我一度沉迷于Roguelike和Roguelite游戏,主要玩Pathos和CDDA。Roguelike游戏的编写不同于其他游戏,画面的表现是次要(甚至可以没有)的,但游戏的内容和玩法非常多。这使得只会编码的我开始着手尝试。当时的游戏参考了Angband和Pathos的设计,其中的阶段性成果如下: 第一版本使用ncurses库制作,已经有了一些初步的功能。
  • 基于SDL的Roguelike阶段: 在2021年6月开始时,由于ncurses库的局限性(只能在Unix下使用,Win不好用),改用了SDL进行制作。所有代码推翻重写(因为对底层设计不满意):
  • 基于SDL的Roguelite阶段: 2021年8月末至2022年4月,接近一年的时间都在忙着考研,但失败。在5月份工作之后重新想起Grogue。此时的我已经学习了更多关于游戏开发和游戏引擎的知识,对旧有的代码不甚满意。经过长时间对游戏引擎开发技术的学习,我发现“没有做过完整游戏的人是无法知道游戏引擎究竟需要什么的”,那时我决定放弃纯纯编写游戏引擎,转而从构建一个游戏开始,当游戏构建完时,他的底层应当可以抽出来作为一个独立引擎。这时Grogue再次进入了我的脑海。之后,7月份我在B站制作了《SDL入门教程》系列视频,在视频的末尾我想要通过编写一个游戏来帮助游戏开发爱好者了解游戏的开发过程。同时我也学习了诸多游戏开发的新知识且需要一个项目来实践。于是,带着这些目标,Grogue的第三次重写开始了。 真正开始重写的时间大约是2023年4月。在此之间的时间花在Vulkan和软渲染上。4月份开始慢慢地搭建底层,5月开始全身心地投入到Grogue的开发中。到现在为止,底层的搭建大部分已经结束,游戏的内容也在慢慢地堆砌。目标是在7月底的时候可以发布1.0版本。

以上就是Grogue的过往。但仍旧有几点需要说明:

  1. Grogue到底是一个什么样的游戏
    目前来说(应该也是最后的目标),Grogue是一个借鉴了CDDA,饥荒,以撒的结合等Roguelike/Roguelite游戏的2D俯视视角,开放世界的探索游戏,游戏本身主打探索,并没有确切的目标。游戏由多个世界组成,玩家可以通过某种手段从一个世界跃迁到另一个世界以此来探索游戏内容。Grogue的核心点/创意点在于,世界是由玩家编写Mod制作的,所以一局游戏可以由很多个风格迥异的世界拼凑而成。玩家在不同的世界来回穿越和生存,不停地发现新事物。同时像Minecraft/饥荒一样,玩家也可以建造自己的建筑物,制作自己的装备,开垦土地等,做一个养老玩家。我希望由于Mod的存在,Grogue可以让不同的人都能玩下去。
  2. 为什么从Roguelike转变成Roguelite:
    因为Grogue的一个目标是“能够将其底层抽出作为游戏引擎”,显然Roguelite游戏的底层比Roguelike的底层更加贴合现代游戏引擎(拥有动画,定时,渲染,物理等)
  3. 为什么不使用Vulkan/OpenGL
    首先,Grogue的定位是2D游戏,SDL足矣。其次,如果真要从Vulkan开始做渲染引擎,那这个游戏的完成时间可能要再次推后,直至无法完成。所以,我直接抛弃渲染部分,不写一行渲染底层代码,而将精力放在引擎的设计和游戏开发当中。
  4. 为什么不编写渲染部分而编写物理部分
    因为物理部分没实践过。渲染部分以前写了一些渲染器代码,算是比较熟悉。
  5. 为什么使用ECS而非OO
    纯粹是为了学习和试用ECS架构。而且ECS可以用在更多的编程语言中(比如不支持OO的Haskell,支持较少的Rust等),算是更加通用。

目前的进展如何?

目前整个游戏的底层已经基本上完成,拥有一个ECS系统,多个组件(渲染组件,窗口组件,资源(字体,图像,Lua脚本)管理组件,定时器组件,信号槽组件等),并且做了Lua语言的绑定,可以调用Lua代码进行游戏功能实现。期间参考了很多游戏引擎,主要是Bevy(因为他也是ECS架构)。信号槽借鉴的Godot。UI组件部分借鉴的Unity。游戏本体的内容非常少,只有随机地图,人物移动和背包系统(未完成)。但是从这个月开始,应该会把重心转移在游戏内容的添加上而非底层。

在发布1.0版本之前,我每周日都会在这里更新Grogue的进展。有喜欢的可以上Github给个Star,谢谢。

updatedupdated2023-07-172023-07-17