2.3 引擎规划
书中例子的游戏引擎分为5个主要部分。
渲染系统、输入系统、声音系统、人工智能系统以及数学库。
引擎的每一部分都有自己的头文件和源文件。
2.3.1 渲染系统
渲染系统包含了一次渲染大批几何图形的程序代码。
2.3.5 数学库
数学库是由引擎及其游戏大量使用的数学类、函数和常量构成的集合。
2.4 游戏项目概述
- 编写启动渲染系统的代码。
- 为渲染系统添加硬件光照和材料支持。
- 为渲染系统增加纹理映射支持。
- 文本和图形用户界面。
- 增加特效
- 基本脚本
- 数学库的构建
- 碰撞检测功能
- 输入系统
- 声音系统
- 模型加载和动画
- 增加让模型沿着动画路径移动的能力
2.5 游戏项目第1部分:启动项目
2.5.1 游戏源文件
第一个游戏项目的main.h 头文件
/*
Demo Name: Game Project 1
Author: Allen Sherrod
Chapter: Chapter 2
*/
#ifndef _UGP_MAIN_H_
#define _UGP_MAIN_H_
#include"StrandedEngine/engine.h" //游戏引擎静态库
#pragma comment(lib, "lib/StrandedEngine.lib")
#define WINDOW_CLASS "StrandedGame" //
#define WINDOW_NAME "Stranded" //窗口名称
#define WIN_WIDTH 800 //宽度
#define WIN_HEIGHT 600 //高度
#define FULLSCREEN 1 //全屏显示
// Function Prototypes...
bool InitializeEngine();
void ShutdownEngine();
// Main game functions.
bool GameInitialize();
void GameLoop();
void GameShutdown();
#endif
游戏引擎将以静态库的形式实现。并绑定到游戏中。
第一个游戏项目的main函数和消息过程函数:
/*
Demo Name: Game Project 1
Author: Allen Sherrod
Chapter: Chapter 2
*/
#include"main.h"
// Globals...
HWND g_hwnd;
CRenderInterface *g_Render = NULL;
LRESULT WINAPI MsgProc(HWND hd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
if(wp == VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hd, msg, wp, lp);
}
int WINAPI WinMain(HINSTANCE h, HINSTANCE p, LPSTR cmd, int show)
{
// Register the window class
WNDCLASSEX wc = {
sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc,
0L, 0L, GetModuleHandle(NULL), NULL, NULL,
NULL, NULL, WINDOW_CLASS, NULL };
RegisterClassEx(&wc);
// Create the application's window
if(FULLSCREEN)
{
g_hwnd = CreateWindowEx(NULL, WINDOW_CLASS, WINDOW_NAME,
WS_POPUP | WS_SYSMENU | WS_VISIBLE, 0, 0,
WIN_WIDTH, WIN_HEIGHT,
NULL, NULL, h, NULL);
}
else
{
g_hwnd = CreateWindowEx(NULL, WINDOW_CLASS, WINDOW_NAME,
WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,
0, WIN_WIDTH, WIN_HEIGHT,
NULL, NULL, h, NULL);
}
if(g_hwnd)
{
// Show the window
ShowWindow(g_hwnd, SW_SHOWDEFAULT);
UpdateWindow(g_hwnd);
}
// Initialize the Stranded Engine.
if(InitializeEngine())
{
// Initialize Stranded game.
if(GameInitialize())
{
// Enter the message loop
MSG msg;
ZeroMemory(&msg, sizeof(msg));
SetCursorPos(0, 0);
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
GameLoop();
}
}
}
// Release any and all resources.
GameShutdown();
ShutdownEngine();
UnregisterClass(WINDOW_CLASS, wc.hInstance);
return 0;
}
完成引擎和游戏的初始化和关闭。
main.cpp文件中余下的代码:
bool InitializeEngine()
{
if(!CreateD3DRenderer(&g_Render)) return false; //渲染系统分配内存
if(!g_Render->Initialize(WIN_WIDTH, WIN_HEIGHT, //初始化渲染系统
g_hwnd, FULLSCREEN)) return false;
g_Render->SetClearCol(0, 0, 0); //清除色为黑色
return true;
}
void ShutdownEngine() //所有系统使用的动态内存清除干净
{
if(g_Render) //清除渲染系统
g_Render->Shutdown();
delete g_Render;
g_Render = NULL;
}
}
bool GameInitialize()
{
return true;
}
void GameLoop() //完成渲染一个黑屏的基本功能
{
if(!g_Render) return;
g_Render->StartRender(1, 1, 0);
g_Render->EndRendering();
}
void GameShutdown()
{
}
清除色是在应用程序启动新帧时,清除后台缓存用的颜色。
2.5.2 引擎源文件和头文件
defines.h文件的全部代码:
/*
Demo Name: Game Project 1
Author: Allen Sherrod
Chapter: Chapter 2
*/
#ifndef _UGP_DEFINES_H_
#define _UGP_DEFINES_H_
#include<windows.h>
// Boolean values.
#define UGP_INVALID -1
#define UGP_OK 1
#define UGP_FAIL 0
// Window handle (need new way if porting to Mac and OpenGL).
#define WinHWND HWND
// Typedefs and enumerations.
typedef long VertexType;
enum PrimType