Files
EVEngine/src/engine

核心启动流程:

  1. main确定启动参数,载入必要的库,确定目标的文件系统(是zip还是),检查目标目录下的文件,如果有用户自定义的boot脚本,就调用,否则调用script中的boot脚本
  2. boot脚本创建环境,载入必要的module,创建游戏循环,读取配置信息,检测并设定对应的回调函数,最终将游戏循环跑起来

游戏打包: 引擎在exe自带了命令行工具,可以执行eve package命令,就可以把当前的脚本和自己的exe文件打包在一起,方式是复制自己的可执行文件,然后在后面添加一个段并把数据压缩存储到此处,最后输入一个单个的可执行文件 也有其他的便利工具,比如可以下载android或ios的工程,方便你把游戏打包成手机版本,手机版本是简化的引擎,没有devtool,命令行这些东西

核心功能: 通过cache数据资源,监视文件修改,实现对数据、程序的热重载,可以快速debug某个状态 快照功能,可以对某个游戏状态快照,在之后发生bug后可以快速回复到之前的状态。 这里希望自己实现一个malloc,通过把数据都放到一起,创建快照时对整个堆进行拷贝,需要恢复时只要直接拷贝内存即可 注意:创建快照后,已经malloc的内存就不能释放了,因为恢复时必须确保同地址依旧可用,否则其中互相引用的指针会出问题

创建快照后,如何恢复C++代码中各种数据的状态?

  1. C++中的渲染是没状态的,下一帧渲染的代码改变后,重新调用update, render这些函数就可用了,重点就是script中的状态
  2. 对于资源,已经载入的会cache住,如果监测到本地文件改变,会给cache进行标记,要求在被访问到时载入新版本,如果本地被删,那么内存中的也会在引用归零后被删掉
  3. 对于绘制后的Canvas等有状态的对象,会有一个管理器,在创建镜像时对这些对象进行状态存储,在恢复时将备份拷贝回来

设计原则

  1. 引擎面向功能进行模块分类,各种核心功能都封装成较为独立的模块,当然相互之间也有接口相连接
  2. 每个模块都可以独立使用,比如graphic就管渲染,window就管窗体,但两者有相连的功能来实现在某个窗体中渲染,但graphic也可以单独使用,进行离屏渲染
  3. 有大量针对DevTool设计的类,可供游戏建模时使用 a. Collection 表示一组内容,该类可以无限派生,比如角色类,技能类, b. Singlton 表示全局独立内容,全局只有一个 c. Tree 表示有子元素的,并且子元素隶属于该对象的
  4. 基于MVVM的UI设计,游戏UI库也是可以动态调整的,这样就给了动态调整组件结构的能力,你在编写好一个UI组件后,UI模型会自动生成一个可以调整的控制页面,这样就可以实现在游戏中对UI,对显示效果进行实时的调整
  5. 编写一些常用的计算、布局游戏UI的组件,只需引入,即可快速布局和计算渲染位置
  6. 不提供常见游戏引擎那种渲染树模型,这个引擎的核心是要求游戏编写时用代码进行高度抽象化,每个对游戏数据库的编辑和修改都要是有逻辑的,这样可以使得各个地方的修改是同步的,没有冗余数据

游戏的核心概念

  1. 游戏数据库和游戏模型 游戏数据库是游戏初始化的数据,是静态的,保存在数据库中的起始数据,可以在任意时间读取出来 游戏模型是动态的,是随时刻发生变化的,比如我可以根据数据库中的数据创建模型,但其角色可以根据状态不同,拥有不同的属性
  2. 游戏地图 作为一款2D游戏引擎,游戏地图的概念是非常核心的,并且其也附带有游戏地图开发工具,编辑器等。这里的游戏地图是抽象的,基于网格的,你可以自由设定有几层,什么组织格式,你根据map类泛化出来的游戏地图模型,可以直接被引擎读取,并生成对应的编辑器,比如你这个层上可以放置Person类,则编辑器上则会把你Person类及其子类的所有游戏数据库中管理的内容分类给你作为放置选项
  3. 游戏脚本 (高级功能) 为了实现丰富的对话系统,这里可以将脚本语言当作游戏脚本使用,来实现自定义的对话,显示人物表情,播放声音和动画等,非常适合用来实现简单的galgame
  4. Avatar分层渲染 (高级功能) 我们可以把一个图像组抽象成多个层,分层渲染可以解决渲染中的覆盖问题,并且可以构建人物渲染模型,实现表情的自由控制,最后你可以通过调整参数就可以程序化地控制渲染样式和顺序
  5. 动画 (后期考虑) 作为一款2D游戏引擎,动画的抽象是非常核心的,这里要建立这样几种不同概念的动画模型 a. 基础帧动画 - 最基本的动画格式,逐帧播放,动画可叠加(每个图层有个zindex可以自由调节渲染顺序) b. 骨骼动画 - 对小片的图像可以进行骨骼动画渲染,通过缩放与变形进行动画渲染,对像素风的动画有特殊优化
  6. 存档 可以设计一套通用的存档系统,通过对类进行序列化,快速实现任意数据结构的存储和打开,C++部分参考cereal, squirrel部分通过C++端进行动态获取和解析可以实现
  7. 状态机 游戏中很多人物的AI或行为都是一个状态机,对状态机进行抽象并提供action的设定接口,运行dev中动态修改状态

DevTools的设计 DevTools不是一个模块,而是一个平台级的东西,他可以检测各个模块的运行状况,资源使用状态,查看fps,甚至是动态载入新的组件都可以。但模块中也有一个devtool的连接组件,可以让脚本程序化地调用devtool的功能,使用其中的UI,注册新的devtool中能用的工具等。使用这个模块时必须在dev模式下,其他android的构建等都没有开发工具。

这个库有如下几个核心功能:

  1. 根据脚本自动生成对游戏数据库的编辑UI, 注重数据的联动性
  2. 一个强大灵活且可扩展的2D地图编辑器
  3. 可以自动生成存档模型,对存档进行编辑
  4. 可以动态检测修改游戏运行中的数据
  5. 可以暂停、重启游戏循环 (这就要求游戏循环的事件可以被打断)

其他开发工具

  1. 数值策划模拟器 - 快速生成各种属性来模拟战斗,统计不同属性下战斗的回合数,判断数值是否合适
  2. 断言工具 - 自动监视游戏变量,看什么时候会变化或不满足条件或约束
  3. 自动机编辑器 - 可视化查看并修改游戏自动机