游戏引擎入门Word下载.docx
- 文档编号:21626150
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:13
- 大小:20.76KB
游戏引擎入门Word下载.docx
《游戏引擎入门Word下载.docx》由会员分享,可在线阅读,更多相关《游戏引擎入门Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
!
一个应用程序运行的基本步骤:
1、初始化
2、启动
3、循环
4、停止
这只是一些必需的步骤,实用的程序会有更多的功能。
PC游戏引擎是根据平台来定的!
这里我就用Windows来讲解.
在Windows平台开发游戏,就必需遵循Windows平台的规则,在Windows平台一个正常的程序也不外乎
是启动、循环、停止。
那么游戏引擎基本需要哪些步骤呢?
2、启动(Windows程序初始化,游戏引擎初始化)
3、暂停(使游戏进入休眠状态)
4、激活(使游戏继续运行)
5、循环(游戏循环)
6、重绘(窗口重绘)
7、停止(游戏结束)
那么知道了这些基本步骤后也就不难理解简单的游戏引擎了,但是游戏引擎不仅仅是这样的结构化程序,
它是多线程的,它是面向对象的。
那么它也就是一个对象!
下面就开始设计这个游戏引擎对象:
*/
#include<
windows.h>
//这是Window程序所需的:
入口函数、与消息过程函数声明
int_stdcallWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intiShowCmd);
LRESULTCALLBACKWndProc(HWNDhWnd,UINTuMSG,WPARAMwParam,LPARAMlParam);
/*这完全是遵循上面提到得7个基本步骤来声明的。
有没有发现这些跟游戏引擎相关的函数都是定义在类外面。
之所以要定义在类外,这里考虑到了游戏引擎被继承
时的重用性,所以把这些功能模块定义在类外是方便游戏引擎类被单独拿开重用。
BOOLGameInitialize(HINSTANCEhInstance);
//初始化
voidGameStart();
//启动
voidGameDeactivate(HWNDhWindow);
//暂停
voidGameActivate(HWNDhWindow);
//激活
voidGameCycle();
//循环
voidGamePaint(HDChDC);
//重绘
voidGameEnd();
//结束程序
//游戏引擎类
classGameEngine
{
protected:
staticGameEngine*m_pGameEngine;
//定义一个游戏引擎对象的全局指针
//以下都是在Window平台绘画一个窗口所需要的成员
HINSTANCEm_hInstance;
HWNDm_hWindow;
TCHARm_szClassName[20],m_szWindowName[32];
WORDm_wIcon,m_wSmallIcon;
intm_iWidth,m_iHeight;
//下面两个是游戏引擎的一些特性
intm_iFrameDelay;
//游戏周期延迟数(ms为单位)
BOOLm_bSleep;
//游戏是否暂停的标志
public:
//类构造函数初始化一部分成员,
//因为窗口句柄必需在CreateWindow后才能获得,所以这里不在这里参数传递.
GameEngine(HINSTANCEhInstance,LPTSTRsz_ClassName,LPTSTRsz_WindowName,WORDwIcon,WORDwSmallIcon,intiWidth=800,intiHeight=600);
virtual~GameEngine();
//用于在类外部获取全局游戏引擎指针的静态全局函数
staticGameEngine*GetEngine(){returnm_pGameEngine;
};
//类初始化,用于创建游戏窗口,显示窗口
BOOLInitialize(intiShowCmd);
//游戏消息过程函数
LRESULTHandEvent(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam);
//以下都是与成员操作相关的函数,这是C++封装的一大特性
HINSTANCEGetInstance(){returnm_hInstance;
HWNDGetWindow(){returnm_hWindow;
voidSetWindow(HWNDhWindow){m_hWindow=hWindow;
LPTSTRGetWindowName(){returnm_szWindowName;
WORDGetIcon(){returnm_wIcon;
WORDGetSmallIcon(){returnm_wSmallIcon;
intGetWidth(){returnm_iWidth;
intGetHeight(){returnm_iHeight;
intGetFrameDelay(){returnm_iFrameDelay;
voidSetFrameDelay(intiFrameRate){m_iFrameDelay=1000/iFrameRate;
BOOLGetSleep(){returnm_bSleep;
voidSetSleep(BOOLbSleep){m_bSleep=bSleep;
二、GameEngine.cpp(游戏引擎代码部分代码文件)之所说是部分因为还有部分类成员函数定义在其他文件里,这样便于将Windows处理与游戏处理代码分开来查看修改
________________________________GameEngine.cpp文件______________________________
#/*设计好游戏引擎类后。
就可以开始定义这些模块了。
我们可以把这些模块分的更细一点
与Windows相关的都定义到GameEngine.cpp里.与游戏相关的代码我们都另外写到Car.cpp文件去.
这里开始就考虑到引擎的继承重用性了,所以那些与游戏相关的代码都是在类外部定义的.
下面就开始定义与Window相关的模块,在此代码区访问游戏引擎对象是用静态全局函数GetEngine来访问的.
#include"
GameEngine.h"
//一定要先让全局引擎指针初始化后,才有地址,这样才可以引用此全局引擎指针间接寻址
GameEngine*GameEngine:
:
m_pGameEngine=NULL;
int_stdcallWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intiShowCmd)
staticintiTickTrigger=0;
//周期触发器,用于控制游戏速度
intiTickCount=0;
//辅助触发器
MSGmsg;
//程序初始化
if(GameInitialize(hInstance))
//类初始化创建游戏窗口,与显示它
if(!
GameEngine:
GetEngine()->
Initialize(iShowCmd))
returnFALSE;
//这种方式与GetMessage有些不同,就是:
少了一次消息过滤与查看消息后的处理由PM_REMOVE标志控制!
while(true)
{
if(PeekMessage(&
msg,NULL,0,0,PM_REMOVE))
if(msg.message==WM_QUIT)
break;
TranslateMessage(&
msg);
DispatchMessage(&
}
else//当没有获取到消息时
//当程序在非休眠状态!
那么将继续运行游戏自动处理的一些步骤,也就是可以运行游戏智能程序!
GetSleep())
iTickCount=GetTickCount();
//判断当前时间是否大于游戏触发时间,也就是游戏设置的延迟时间!
if(iTickCount>
iTickTrigger)//当这个时间大于延迟时间后也就可以继续运行游戏了,,这里代表了游戏的速度
iTickTrigger=iTickCount+GameEngine:
GetFrameDelay();
GameCycle();
}
return(int)msg.wParam;
}
returnEXIT_SUCCESS;
LRESULTCALLBACKWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
returnGameEngine:
HandEvent(hWnd,uMsg,wParam,lParam);
//类构造初始化
GameEngine(HINSTANCEhInstance,LPTSTRsz_ClassName,LPTSTRsz_WindowName,WORDwIcon,WORDwSmallIcon,intiWidth,intiHeight)
{
m_pGameEngine=this;
m_hInstance=hInstance;
if(lstrlen(sz_ClassName)>
0)
lstrcpy(m_szClassName,sz_ClassName);
if(lstrlen(sz_WindowName)>
lstrcpy(m_szWindowName,sz_WindowName);
m_wIcon=wIcon;
m_wSmallIcon=wSmallIcon;
m_iWidth=iWidth;
m_iHeight=iHeight;
m_iFrameDelay=50;
//默认给50MS延迟
m_bSleep=FALSE;
//默认不是休眠
//析构函数
~GameEngine()
//游戏初始化
BOOLGameEngine:
Initialize(intiShowCmd)
WNDCLASSEXwcl;
//wcl作用域是构造函数,但是注册成窗口类后,类对象作用域就是整个程序!
wcl.cbSize=sizeof(wcl);
wcl.style=CS_HREDRAW|CS_VREDRAW;
wcl.lpfnWndProc=WndProc;
wcl.cbClsExtra=0;
wcl.cbWndExtra=0;
wcl.hInstance=m_hInstance;
wcl.hIcon=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));
wcl.hIconSm=LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));
wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
wcl.hbrBackground=(HBRUSH)(COLOR_WINDOW+3);
wcl.lpszMenuName=NULL;
wcl.lpszClassName=m_szClassName;
//注册游戏窗口类
RegisterClassEx(&
wcl))
//这里为了将游戏窗口居中屏幕需要做些计算,因为类成员的宽与高只是指客户区宽、高,并不是指整个窗口
//所以需加上窗口两边的厚度,高也同理加上下两边的厚度然后加上菜单的厚度.才能获得正确的窗口大小
intiWindowWidth=GameEngine:
GetWidth()+GetSystemMetrics(SM_CXFIXEDFRAME)*2,
iWindowHeight=GameEngine:
GetHeight()+GetSystemMetrics(SM_CYFIXEDFRAME)*2;
if(wcl.lpszMenuName!
=NULL)//如果有菜单当然要加上这个厚度
iWindowHeight+=GetSystemMetrics(SM_CYMENU);
//让窗口居中根据屏幕宽度减去窗口宽/2得到居中位置.
intiXWindowPos=(GetSystemMetrics(SM_CXSCREEN)-GameEngine:
GetWidth())/2,
iYWindowPos=(GetSystemMetrics(SM_CYSCREEN)-GameEngine:
GetHeight())/2;
//得到正确的窗口大小与位置后就可以创建它了
m_hWindow=CreateWindow(m_szClassName,m_szWindowName,WS_POPUPWINDOW|
WS_CAPTION|WS_MINIMIZEBOX,iXWindowPos,iYWindowPos,iWindowWidth,
iWindowHeight,NULL,NULL,m_hInstance,NULL);
if(!
m_hWindow)
ShowWindow(m_hWindow,iShowCmd);
UpdateWindow(m_hWindow);
returnTRUE;
//游戏过程函数
LRESULTGameEngine:
HandEvent(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
switch(uMsg)
caseWM_SETFOCUS:
//程序得到焦点
GameActivate(hWnd);
GameEngine:
SetSleep(FALSE);
caseWM_KILLFOCUS:
//程序失去焦点
GameDeactivate(hWnd);
SetSleep(TRUE);
caseWM_CREATE:
GameStart();
caseWM_PAINT:
PAINTSTRUCTps;
//得到需要重绘的矩形区域
GamePaint(BeginPaint(hWnd,&
ps));
EndPaint(hWnd,&
ps);
caseWM_CLOSE:
DestroyWindow(hWnd);
caseWM_DESTROY:
PostQuitMessage(0);
GameEnd();
returnDefWindowProc(hWnd,uMsg,wParam,lParam);
三、接下来就全是跟游戏相关的代码了以上都是Windows必需的一些代码,
____________________________________Fire.h文件___________________________________
Resource.h"
//用于在此游戏代码区访问引擎对象
GameEngine*g_pGameEngine;
staticintRemoveCount1=0;
staticintRemoveCount2=0;
四、游戏主要处理代码
____________________________________Fire.cpp文件___________________________________
//为了与WINDOWS平台代码区分开,此文件作为游戏代码区、
Car.h"
//初始化游戏程序
BOOLGameInitialize(HINSTANCEhInstance)
g_pGameEngine=newGameEngine(hInstance,TEXT("
Car"
),TEXT("
游戏引擎测试"
),IDI_ICON1,IDI_ICON1);
if(!
g_pGameEngine)
//游戏速度
g_pGameEngine->
SetFrameDelay(30);
returnTRUE;
//游戏启动
voidGameStart()
//取当前Window启动以来的ms数为随机数种子
srand(GetTickCount());
//暂停
voidGameDeactivate(HWNDhWindow)
HDChDC;
RECTrect;
GetClientRect(hWindow,&
rect);
hDC=GetDC(hWindow);
DrawText(hDC,TEXT("
游戏暂停!
"
),-1,&
rect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
ReleaseDC(hWindow,hDC);
;
//游戏激活
voidGameActivate(HWNDhWindow)
游戏激活!
//游戏循环
voidGameCycle()
HWNDhWindow=g_pGameEngine->
GetWindow();
RECTstRect;
//获得该窗口的绘画环境设备
GetClientRect(hWindow,&
stRect);
hDC=GetDC(hWindow);
//这是奇怪的现象:
呵呵所以我就不用窗口重绘了!
具体请看运行效果
DrawIcon(hDC,RemoveCount1,150,(HICON)(WORD)GetClassLong(hWindow,GCL_HICON));
RemoveCount1=RemoveCount1>
=stRect.right?
0:
RemoveCount1+rand()%2;
DrawIcon(hDC,RemoveCount2,300,(HICON)(WORD)GetClassLong(hWindow,GCL_HICON));
RemoveCount2=RemoveCount2>
RemoveCount2+rand()%2;
ReleaseDC(hWindow,hDC);
//游戏重绘
voidGamePaint(HDChDC)
GetClientRect(g_pGameEngine->
GetWindow(),&
FillRect(hDC,&
stRect,(HBRUSH)(COLOR_WINDOW+3));
//游戏结束
voidGameEnd()
deleteg_pGameEngine;
还有部分代码没贴上来。
就是资源脚本文件.rc因为上述代码用到了图标资源!
所以还要编译一个res资源文件,可以根据资源标识自行定义资源!
现在来总结一下,每个文件的作用
1、GameEngine.h文件:
包含游戏引擎以及Win32程序所需的一些声明。
而游戏引擎则所需的属性与方法则全部包装在GameEngine类里面。
2、GameEngine.cpp文件:
游戏在Window平台启动所需要的一些方法,则全部被定义在这个文件里面了.
3、Car.h文件:
这是游戏具体实现的头文件:
游戏引擎完成后的一些处理方法
4、car.cpp文件:
这是游戏具体实现方法
5、GameEngine.rc文件:
这是游戏中要用到的资源脚本文件,,比如说声音图像等等资源.而在真正的游戏开发远远不只这些资源.,
在3d游戏中还需要导入sdmax编译的资源!
好了,,接下来自己试验吧!
GoodGoodStudyDayDayUp!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 引擎 入门