1、封裝一個游戲類: 包含一個初始化函數(shù)、一個更新函數(shù)、一個處理輸入函數(shù)稀火、一個渲染函數(shù)
class Game
{
? ?public:
? ? ? ? //游戲狀態(tài)
? ? ? ? GameState? State;? ?
? ? ? ? GLboolean? Keys[1024];
? ? ? ? GLuint? ? Width,Height;
? ? ? ? //構(gòu)造函數(shù)/析構(gòu)函數(shù)
? ? ? ? Game(GLuint width,GLuint height);
? ? ? ? ~Game();
? ? ? ? //初始化游戲狀態(tài)(加載所有的著色器/紋理/關(guān)卡)
? ? ? ? void Init();
? ? ? ? //游戲循環(huán)
? ? ? ? void ProcessInput(GLfloat dt);
? ? ? ? void Update(GLfloat dt);
? ? ? ? void Render();
};
// 代表了游戲的當(dāng)前狀態(tài)
enum GameState {
? ? GAME_ACTIVE,
? ? GAME_MENU,
? ?GAME_WIN
};?
GameState 來標(biāo)記當(dāng)前游戲所處的狀態(tài),一般情況下不同的狀態(tài)會觸發(fā)不同的動作兽狭。? 在構(gòu)造函數(shù)中我們通過一個Width憾股、Height去初始化窗口鹿蜀、設(shè)置分辨率等操作。? Init()函數(shù)中初始化著色器服球、紋理等茴恰。 ProcessInput函數(shù)從Keys數(shù)組里面獲取輸入?yún)?shù)處理用戶的輸入。 Update()函數(shù)用來更新渲染設(shè)置斩熊。 Render()負(fù)責(zé)渲染往枣。
2、工具類:在程序中我們會用到很多的shader粉渠,以及很多的紋理分冈。 所以我們可以將shader以及紋理的創(chuàng)建過程分別封裝起來。抽離出shader類和紋理類霸株。
3雕沉、資源管理器:shader需要加載著色器代碼文本,紋理需要加載紋理資源去件,為了符合單一功能原則坡椒, 我們可以將資源的加載邏輯抽離出來。用一個資源管理器類統(tǒng)一管理尤溜。
Shader shader = ResourceManager::LoadShader("vertex.vs", "fragment.vs", nullptr, "test");
// 接下來使用它shader.Use();
4倔叼、精靈類: 精靈的可以理解為紋理加上一些屬性的對象,就是我們在游戲中看到的各種各樣的獨(dú)立的個體宫莱。就如現(xiàn)實(shí)中的萬事萬物一樣我們可以將擁有相同屬性的精靈抽象理解出一個個精靈類的概念丈攒,代碼中用類和對象描述這種關(guān)系。
抽離出一個簡單的精靈類授霸,可以設(shè)置位置和紋理, 擁有一個shader用于渲染巡验。
class SpriteRenderer
{
? ?public:
SpriteRenderer(Shader &shader);
? ? ? ? ~SpriteRenderer();
? ? ? ? void DrawSprite(Texture2D &texture,glm::vec2 position,?
? ? ? ? ? ? glm::vec2 size = glm::vec2(10,10),GLfloat rotate = 0.0f,?
? ? ? ? ? ? glm::vec3 color = glm::vec3(1.0f));
? ? private:
? ? ? ? Shader shader;?
? ? ? ? GLuint quadVAO;
? ? ? ? void initRenderData();
};
私有屬性quaVAO定點(diǎn)數(shù)組對象包含了頂點(diǎn)坐標(biāo)和紋理坐標(biāo)。shader 著色器程序碘耳。在initRenderData() 中初始化頂點(diǎn)數(shù)組對象深碱,配置好著色器讀取位置。DrasSprite函數(shù)中配置好了精靈的渲染指令藏畅。