版本信息
- 版本号:TEnGinE Version-0.1 Build-6
- 内部版本:v0.00.00.10
- 发布日期:2022-05-02 22:34
- 更新类型:架构重构与功能扩展
这次的更新围绕着两个关键词展开:
- 解耦:将紧密耦合的输入处理逻辑拆分为独立、可复用的模块
- 扩展:引入游戏对象系统的雏形,为未来的实体组件系统(ECS)做准备
输入系统重构
旧系统的问题
在 Build-5 中,KeyEventBase 类承担了太多职责:
- 按键注册管理
- 按键状态检测
- 移动逻辑处理
- 坐标更新计算
这种设计导致代码难以维护,功能难以扩展,更无法支持复杂的输入映射系统。
新系统的架构
全新的 InsertEventBase 采用了更加清晰的责任分离:
cpp
struct Key_Unit
{
int GLFW_KEY{ NULL };
bool MoveToX{ false };
bool MoveToY{ false };
float MoveLen{ 0.0f };
};
class InsertEventBase
{
public:
static InsertEventBase& GetInsertBase();
void RegistEvent(Key_Unit KU);
void GetInsert(GLFWwindow* window, float* MoveX, float* MoveY);
private:
std::vector<Key_Unit> KeyEventS;
};
设计亮点
- 纯数据驱动 :
Key_Unit结构体只包含按键配置数据,不包含任何逻辑 - 单一职责 :
InsertEventBase只负责按键检测和坐标更新,不处理具体的游戏逻辑 - 易于扩展:支持任意数量的按键绑定,未来可轻松添加按键组合、轴输入等功能
- 测试友好:输入逻辑与游戏状态分离,便于单元测试
游戏对象系统
Build-6 引入了一个全新的头文件:Tanxl_GameObject.h。虽然目前它只是一个空的类定义:
cpp
class GameObjectBase
{
};
未来的设想
这个空类预示着未来的发展方向:
- 组件化设计:可添加渲染、物理、脚本等组件
- 层级系统:支持父子关系、局部/世界坐标变换
- 生命周期管理:统一的创建、更新、销毁流程
- 序列化支持:便于关卡编辑和资源管理
控制台菜单微调
Tanxl_Console_List 模块也迎来了一个小版本更新(1.5++_Final):
- 版本提升:从 1.5+_Final 升级到 1.5++_Final
- 功能优化:"调整添加物品的输入序列"------虽然具体改动不大,但这体现了对细节的持续打磨
- 设计延续:保持与控制台菜单系统的一致性,确保现有功能的稳定性
更新对比:Build-5 vs Build-6
| 维度 | Build-5 | Build-6 |
|---|---|---|
| 输入系统 | KeyEventBase(紧耦合) |
InsertEventBase(松耦合) |
| 架构思想 | 代码精简,去除冗余 | 模块重构,面向扩展 |
| 新增功能 | - | 游戏对象系统基础框架 |
| 核心变化 | 构建系统优化 | 核心架构重构 |
| 代码行数 | 减少35行 | 新增9行(GameObject头文件) |
| 设计目标 | 提高编译效率 | 提高系统可扩展性 |
开发者的思考
重构的挑战
- 向后兼容:确保现有游戏逻辑不受影响
- 性能考量:新的系统不能比旧系统更慢
- 学习成本:新的API应该更简单,而不是更复杂
成果验证
虽然新系统还未集成到主渲染循环中,但独立的测试已经证明:
- 新的架构更加清晰
- 扩展新按键类型只需几行代码
- 输入逻辑与游戏逻辑彻底分离
技术细节
重构带来的好处
- 代码可读性 :新的
Key_Unit结构体一目了然 - 维护成本:分离关注点,修改输入逻辑不影响游戏逻辑
- 团队协作:不同的开发者可以并行开发输入系统和游戏逻辑
潜在风险
- 过渡期:新旧系统并存可能导致 confusion
- 性能开销:更多的抽象层可能带来轻微的性能损失
- 学习曲线:新的API需要适应时间
缓解措施
- 渐进式迁移:逐步替换旧代码,而非一次性重写
- 性能测试:确保新系统满足实时性要求
- 文档更新:为新的API提供详细的使用示例
总结
- 架构清晰:输入处理与游戏逻辑彻底分离
- 面向未来:游戏对象系统为ECS架构奠定基础
- 易于测试:模块化设计便于单元测试和集成测试
- 扩展性强:支持未来添加各种输入设备和功能
- 保持兼容:不影响现有游戏功能和渲染逻辑
Wild_Chicken_Programing · 2022-05-02