【V0.1B6】从零开始的2D游戏引擎开发之路

版本信息

  • 版本号: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;
};

设计亮点

  1. 纯数据驱动Key_Unit 结构体只包含按键配置数据,不包含任何逻辑
  2. 单一职责InsertEventBase 只负责按键检测和坐标更新,不处理具体的游戏逻辑
  3. 易于扩展:支持任意数量的按键绑定,未来可轻松添加按键组合、轴输入等功能
  4. 测试友好:输入逻辑与游戏状态分离,便于单元测试

游戏对象系统

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头文件)
设计目标 提高编译效率 提高系统可扩展性

开发者的思考

重构的挑战

  1. 向后兼容:确保现有游戏逻辑不受影响
  2. 性能考量:新的系统不能比旧系统更慢
  3. 学习成本:新的API应该更简单,而不是更复杂

成果验证

虽然新系统还未集成到主渲染循环中,但独立的测试已经证明:

  • 新的架构更加清晰
  • 扩展新按键类型只需几行代码
  • 输入逻辑与游戏逻辑彻底分离

技术细节

重构带来的好处

  1. 代码可读性 :新的 Key_Unit 结构体一目了然
  2. 维护成本:分离关注点,修改输入逻辑不影响游戏逻辑
  3. 团队协作:不同的开发者可以并行开发输入系统和游戏逻辑

潜在风险

  1. 过渡期:新旧系统并存可能导致 confusion
  2. 性能开销:更多的抽象层可能带来轻微的性能损失
  3. 学习曲线:新的API需要适应时间

缓解措施

  1. 渐进式迁移:逐步替换旧代码,而非一次性重写
  2. 性能测试:确保新系统满足实时性要求
  3. 文档更新:为新的API提供详细的使用示例

总结

  1. 架构清晰:输入处理与游戏逻辑彻底分离
  2. 面向未来:游戏对象系统为ECS架构奠定基础
  3. 易于测试:模块化设计便于单元测试和集成测试
  4. 扩展性强:支持未来添加各种输入设备和功能
  5. 保持兼容:不影响现有游戏功能和渲染逻辑

Wild_Chicken_Programing · 2022-05-02

相关推荐
AllData公司负责人7 分钟前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
Hello.Reader30 分钟前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
一只大袋鼠32 分钟前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
TE-茶叶蛋1 小时前
深入研究 yudao-framework 模块:Java 编程能力提升指南
java·开发语言
逻辑驱动的ken1 小时前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
兔小盈1 小时前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
CeshirenTester2 小时前
LangChain的工具调用 vs 原生Skill API:性能差在哪儿?
java·人工智能·langchain
yaoxin5211232 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
Fox爱分享2 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
6190083362 小时前
win idea 控制台中文乱码
java·ide·intellij-idea