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

TEnGinE Version-0.1 Build-10 更新日志

发布日期: 2022-05-11 00:20
内部版本号: Version-0.1 Build-10


变更概要表

类别 内容
核心功能 DataBase模块加入内存申请成功与否的判断机制
功能新增 GameState模块新增2D棋盘物品位置微调功能(SetExacHeight/SetExacWidth)
代码清理 绘制模块移除早期遗留变量(StatePos、movespeed),numVAOs改为const
接口精简 Utils模块移除3个现阶段无用的ShaderProgram重载函数
文件清理 删除空文件Tanxl_StateControl.h

一、DataBase模块内存安全增强(核心改进)

AppendItem()Get_LocalData() 两处涉及 new 内存申请的位置增加了NULL指针检查。

Tanxl_DataBase.cpp - AppendItem() 函数:

cpp 复制代码
	else
	{
		Data_Vector* DTemp = new Data_Vector(
			Item_Instance.Status_3, Item_Instance.Oth1,
			Item_Instance.Status_4, Item_Instance.Oth2,
			Item_Instance.Status_5, Item_Instance.Oth3);
		Id_Vector* ITemp = new Id_Vector(
			Item_Instance.Status_1, Item_Instance.Status_2,
			Item_Instance.Code, Item_Instance.Name);
		if (DTemp && ITemp)// ← 新增:判断是否申请空间成功
			Append_Chain(*DTemp, *ITemp);
		else
			throw "添加失败! 申请内存空间失败"; // ← 新增
	}

Tanxl_DataBase.cpp - Get_LocalData() 函数:

cpp 复制代码
					else if (Tag == "/TDB")
					{
						Data_Vector* Data_Temp = new Data_Vector(IData[0], SData[0], IData[1], SData[1], IData[2], SData[2]);
						Id_Vector* Id_Temp = new Id_Vector(Type_Stat, Exac_Stat, Type_Data, Exac_Data);
						IData[0] = 0; IData[1] = 0; IData[2] = 0; SData[0] = ""; SData[1] = ""; SData[2] = "";
						if (Data_Temp && Id_Temp) // ← 新增:判断是否申请空间成功
							Append_Chain(*Data_Temp, *Id_Temp);
						else
							throw "添加失败! 申请内存空间失败"; // ← 新增
						continue;
					}

二、GameState模块2D棋盘位置微调功能(新功能)

GameStateBase 类新增三个公开方法及一个私有成员变量,用于对2D棋盘上的物品进行精确位置微调。

Tanxl_GameState.h - 新增声明:

cpp 复制代码
	void SetAdjust(float Adjust);                          // ← 新增:设置微调幅度
	size_t GetStateSize();
	StateUnit* GetStateUnit(int Pos);
	static GameStateBase& GetStateBase(int Height = 0, int Width = 0);
	void SetExacHeight(float& Current);                    // ← 新增:微调高度位置
	void SetExacWidth(float& Current);                     // ← 新增:微调宽度位置
	int GetStateHeight()const;
	int GetStateWidth()const;
private:
	// ...
	int GameState_Width;
	int GameState_Height;
	float GameState_Adjust;                                // ← 新增:微调幅度存储
	std::vector<StateUnit*>GameState;

Tanxl_GameState.cpp - 新增实现:

cpp 复制代码
void GameStateBase::SetAdjust(float Adjust)                // ← 新增
{
	this->GameState_Adjust = Adjust;
}

// ... 中间省略无变化代码 ...

void GameStateBase::SetExacHeight(float& Current)           // ← 新增
{
	static int EHCount = 0;
	int LevelCount = 0;
	float SingleBlock = 2.0f / GameState_Height;
	while (SingleBlock < Current)
	{
		SingleBlock += 2.0f / GameState_Height;
		LevelCount++;
	}
	if (SingleBlock - Current > Current - (SingleBlock - 2.0f / GameState_Height))
	{
		EHCount++;
		if (EHCount == 10)
			Current -= GameState_Adjust;
	}
	else
	{
		EHCount++;
		if (EHCount == 10)
			Current += GameState_Adjust;
	}
}

void GameStateBase::SetExacWidth(float& Current)            // ← 新增
{
	static int EWCount = 0;
	int LevelCount = 0;
	float SingleBlock = 2.0f / GameState_Width;
	while (SingleBlock < Current)
	{
		SingleBlock += 2.0f / GameState_Width;
		LevelCount++;
	}
	if (SingleBlock - Current > Current - (SingleBlock - 2.0f / GameState_Width))
	{
		EWCount++;
		if (EWCount == 10)
			Current -= GameState_Adjust;
	}
	else
	{
		EWCount++;
		if (EWCount == 10)
			Current += GameState_Adjust;
	}
}

构造函数与拷贝构造更新:

cpp 复制代码
GameStateBase::GameStateBase(int Height, int Width) :
	GameState_Width(Height), GameState_Height(Width), GameState(NULL),GameState_Adjust(0.0f) {}  // ← 修改:初始化列表新增GameState_Adjust

// ...

GameStateBase::GameStateBase(const GameStateBase&) :GameState_Width(0), GameState_Height(0),GameState_Adjust(0) {}  // ← 修改

三、绘制模块遗留代码清理(代码优化)

Tanxl_OpenGL_Draw.h 变更:

cpp 复制代码
const int numVAOs = 1;                    // ← 修改:从宏定义改为const常量

GLuint PosA, PosB;
GLuint PosX, PosY;
GLuint Height, Width;
// GLuint StatePos;                        // ← 删除:未使用的全局变量

GLint StateInfor[100];

bool Clear_Function = false;

float movex;
float movey;
// float movespeed = 0.01f;                // ← 删除:未使用的速度变量

GLuint renderingProgram;
GLuint vao[numVAOs];

四、Utils模块接口精简(代码瘦身)

移除3个当前项目未使用的高级ShaderProgram创建重载函数。

Utils.h - 移除声明:

cpp 复制代码
public:
	static bool checkOpenGLError();
	static GLuint createShaderProgram(const char *vp, const char *fp);
	// ↓ 以下3个重载已删除 ↓
	// static GLuint createShaderProgram(const char *vp, const char *gp, const char *fp);
	// static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp);
	// static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, char *gp, const char *fp);
};

Utils.cpp - 移除实现:

cpp 复制代码
GLuint Utils::createShaderProgram(const char *vp, const char *fp) {
	GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);
	GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);
	GLuint vfprogram = glCreateProgram();
	glAttachShader(vfprogram, vShader);
	glAttachShader(vfprogram, fShader);
	finalizeShaderProgram(vfprogram);
	return vfprogram;
}
// ↑ 此处删除了原Build-9中第100-140行的3个重载函数实现

五、文件清理(工程整理)

删除文件: Tanxl_StateControl.h

该文件内容仅为空的 #pragma once 预编译指令,属于早期占位文件,现已确认无用并移除。


影响范围总览表

文件 旧版行数 新版行数 变更类型
Tanxl_DataBase.h 152 153 修改(注释更新)
Tanxl_DataBase.cpp 610 616 修改(新增内存判断逻辑×2)
Tanxl_GameState.h 71 76 修改(新增3方法+1成员变量声明)
Tanxl_GameState.cpp 116 170 修改(新增54行实现代码+构造函数更新)
Tanxl_OpenGL_Draw.h 163 160 修改(删除2变量+1宏改const)
Utils.h 74 70 修改(删除3个方法声明)
Utils.cpp 140 98 修改(删除42行实现代码)
Tanxl_StateControl.h 1 - 删除(空文件移除)

净代码量变化: +19行(主要为GameState新功能实现),-45行(Utils精简+变量清理)


技术要点总结

架构层次图

code

复制代码
┌─────────────────────────────────────────────────────────┐
│                   TEnGinE V0.1 B10                       │
├──────────────┬──────────────┬───────────────────────────┤
│  DataBase    │  GameState   │     Rendering             │
│  ┌────────┐  │  ┌────────┐ │  ┌────────────────────┐   │
│  │内存安全 │  │ │位置微调 │ │  │ const常量化       │   │
│  │判断机制 │  │ │功能    │ │  │ 遗留变量清除      │   │
│  └────────┘  │  └────────┘ │  └────────────────────┘   │
├──────────────┴──────────────┴───────────────────────────┤
│                      Utils Module                        │
│              ┌─────────────────────────┐                │
│              │ 精简为基础VP+FP渲染管线  │                │
│              └─────────────────────────┘                │
└─────────────────────────────────────────────────────────┘

核心 API 说明

API/配置项 所属模块 说明
AppendItem() 内存判断 DataBase new操作后增加NULL检查,失败时抛出异常
Get_LocalData() 内存判断 DataBase 文件读取时链表节点创建增加安全校验
SetAdjust(float) GameState 设置2D棋盘位置微调幅度(单位:OpenGL坐标)
SetExacHeight(float&) GameState 对Y轴坐标进行周期性微调(每10次调用触发)
SetExacWidth(float&) GameState 对X轴坐标进行周期性微调(每10次调用触发)
numVAOs → const OpenGL_Draw 从预处理器宏改为类型安全的const常量

位置微调算法:

复制代码
计算单格尺寸 → 定位所在格子 → 判断距离边界远近 → 
每10帧累加一次偏移量(方向由距离决定)

本次更新以代码健壮性提升为主线(内存安全判断),辅以功能性扩展(2D位置微调)和工程整洁度改善(接口精简、遗留代码清理)。

Wild_Chicken_Programing /// 2022-05-11 00:20

相关推荐
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
小当家.1052 小时前
PostgreSQL 做向量数据库:pgvector 在 RAG 中的实战与多场景适配
数据库·人工智能·postgresql·rag
ForgeAI码匠2 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
z落落2 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#
Access开发易登软件2 小时前
Access 和 SQLite,根本不在一个赛道上
java·jvm·数据库·sqlite·excel·vba·access开发
小马爱打代码2 小时前
Spring源码 第十篇:Spring 5 源码深度拆解 - Spring 类型转换与校验体系
java·spring
长谷深风1112 小时前
Java 面试高频:反射机制与异常体系全面解析
java·开发语言·面试·exception·java 反射·java 异常·class 对象
过期动态2 小时前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展
一 乐2 小时前
疫苗发布和接种预约|基于Java+vue疫苗发布和接种预约系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·疫苗发布和接种预约系统系统