游戏开发基础.docx
- 文档编号:1785569
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:45
- 大小:35.37KB
游戏开发基础.docx
《游戏开发基础.docx》由会员分享,可在线阅读,更多相关《游戏开发基础.docx(45页珍藏版)》请在冰豆网上搜索。
游戏开发基础
游戏开发基础(7)
第七章游戏编程的特点
第一节概述:
电脑游戏在计算机发展使用中可以说扮演了一个极为有趣的角色,一方面不为很多人所赞同,认为是一种浪费;而另一方面电脑游戏却是推动计算机的各项技术迅速发展的最有力的力量之一。
这一点,可以从3d类游戏对硬件无止境的需求,游戏迷对游戏图像的质量、游戏的交互性、人机界面的友好性等方面的需求体现出来(当然游戏迷对游戏的的构思、创意的要求也是苛刻且无止境的,但这一点只有靠您自己的想象力,我们是爱莫能助了)。
从游戏近期的发展中,我们从3d游戏的发展,可以看到从Doom到现在的古墓丽影2、雷神之锤2,3d游戏的画面从生硬单调的多边形到今天柔和复杂几进乱真的场景、道具、怪物,敌人从只会疯狂向你冲来到今天会偷袭、会审时度势地采取合适的方式方法向你进攻;游戏无论从硬件支持还是编程技术方面都有突飞猛进的进展。
在游戏发展的过程中,很多技术也随之发展起来了,例如各种图形加速卡的出现和发展,directx的出现,和各个成功游戏中采用的各种优化技术都推动了计算机技术的发展。
游戏可以说是集合了每个时期计算机行业中最先进的硬件技术和最新的编程思想,比如近期的游戏都是采用了面向对象的编程思想的基于Windows的软件,大部分图象要求高的游戏都要求或支持图形加速卡。
同时游戏编程中也有自己基本的方式方法、结构和理论,在这一章的学习中我们将讨论这些问题。
在这一章中我们将讨论下面几个问题:
程序入口即是游戏获取外部操作的讯息,得到下次刷新所需的新参数的手段。
如同一般的SDKWindows应用程序一样,程序的入口为WINMAIN()。
游戏初始化包括创建标准的WINDOWS程序所需的初始化程序以及游戏内部的初始化程序,例如游戏系统初始化、游戏图形的装入、游戏声音的装入等。
游戏内部循环:
游戏的循环入口是WINDOWS消息循环内部的一个函数调用,游戏内部循环包括刷新游戏单位、画游戏单位两部分。
刷新游戏单位:
用于每一帧刷新游戏单位的状态,例如改变游戏单位的状态、改变游戏单位的位置、获取外部信息等。
画游戏单位:
用于每一帧往屏幕上画游戏单位的图象,并进行特殊处理以提高速度。
计算机人工智能:
主要用于受计算机处理的游戏单位的行为控制算法,程序部分位于刷新计算机游戏单位部分中。
游戏内存管理:
这一部分对于优质高效的游戏软件是十分重要的,内存管理不当会导致游戏性能的降低,甚至引起死机。
游戏交互设计:
交互设计是游戏可玩性的关键,友好的交互界面和交互方式可以使游戏增色不少。
游戏图象底层设计:
游戏软件的主要处理时间花在处理图象和画图象上,所以游戏图象底层的设计对于游戏的最终效果是十分重要的。
游戏多媒体设计:
主要包括图形界面设计、游戏音乐音效设计、游戏动画设计、游戏影象设计的几个方面,更广泛的说还包括游戏所有运行过程的功能设计。
第二节程序入口
这个标题看起来似乎很难理解,它的意思就是当游戏被启动时,计算机从什么地方开始运行程序的。
在Windows的应用程序上,Winmain()函数一般就是程序入口。
游戏开始后,就调用Winmain()函数,然后再按语句的顺序或所接受到的消息调用相应的函数。
从第三章Windows编程基础中我们了解到Winmain()函数的的结构、运行过程,现在我们就游戏编程的角度来讨论Winmain()函数的编制。
intPASCALWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,
intnCmdShow)
{
MSGmsg;
while(lpCmdLine[0]=='-'||lpCmdLine[0]=='/')
{
lpCmdLine++;
switch(*lpCmdLine++)
{
case'e':
bUseEmulation=TRUE;
break;
case'w':
bFullscreen=FALSE;
break;
case'f':
bFullscreen=TRUE;
break;
case'1':
CmdLineBufferCount=1;
break;
case'2':
case'd':
CmdLineBufferCount=2;
break;
case'3':
CmdLineBufferCount=3;
break;
case's':
bStretch=TRUE;
break;
case'S':
bWantSound=FALSE;
break;
case'x':
bStress=TRUE;
break;
case'?
':
bHelp=TRUE;
bFullscreen=FALSE;//givehelpinwindowedmode
break;
}
while(IS_SPACE(*lpCmdLine))
{
lpCmdLine++;
}
}
GameMode.cx=getint(&lpCmdLine,640);
GameMode.cy=getint(&lpCmdLine,480);
GameBPP=getint(&lpCmdLine,8);
/*
*createwindowandotherwindowsthings
*/
if(!
initApplication(hInstance,nCmdShow))
{
returnFALSE;
}
/*
*Giveuserhelpifaskedfor
*
*Thisisuglyfornowbecausethewholescreenisblack
*exceptforthepopupbox.Thiscouldbefixedwithsome
*worktogetthewindowsizerightwhenitwascreatedinstead
*ofdelayingthatwork.seeddraw.c
*
*/
if(bHelp)
{
MessageBox(hWndMain,
"F12-Quit\n"
"NUMPAD2-crouch\n"
"NUMPAD3-apple\n"
"NUMPAD4-right\n"
"NUMPAD5-stop\n"
"NUMPAD6-left\n"
"NUMPAD7-jump\n"
"\n"
"Commandlineparameters\n"
"\n"
"-eUseemulator\n"
"-SNoSound\n"
"-1Nobackbuffer\n"
"-2Onebackbuffer\n"
"-4Threebackbuffers\n"
"-sUsestretch\n"
"-xDemoorstressmode\n",
OUR_APP_NAME,MB_OK);
}
/*
*initializeforgameplay
*/
if(!
InitGame())
{
returnFALSE;
}
dwFrameTime=timeGetTime();
while
(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!
GetMessage(&msg,NULL,0,0))
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
elseif(!
bPaused&&(bIsActive||!
bFullscreen))
{
ProcessFox(lastInput);
lastInput=0;
}
else
{
WaitMessage();
}
}
if(AveFrameRateCount)
{
AveFrameRate=AveFrameRate/AveFrameRateCount;
Msg("Averageframerate:
%d",AveFrameRate);
}
returnmsg.wParam;
}/*WinMain*/
我们知道在消息循环之中只有一个消息----WM_QUIT可以结束这个循环,退出WINDOWS。
所以我们要在消息循环之前完成所有的工作即所有的初始化。
关于初始化这个概念在下一节我们将详细讨论。
在我们提供的例程(在光盘的sample目录中)中的foxbear.c里的WMain()中我们可以看到在消息循环之前先运行DDint()函数对DirectDraw进行初始化,检测命令行参数并对相关的参数进行赋值和确定显示模式,进行窗口的初始化,检测bhelp的值以确定是否显示帮助对话框,进行游戏的初始化。
在一个游戏的消息循环中除了包含一般Windows应用程序的消息循环所应包含的部分外还应有调用有关检测游戏单位状态位置、刷新游戏单位和重画新图以及有关人工智能的函数的部分。
在例程中的消息循环部分包含了一个关于检测游戏单位状态位置、刷新游戏单位和重画新图函数的调用。
在这些调用中一般有两种方法:
1.在消息循环中直接调用有关函数。
比如说在一个RPG的游戏中每个循环都检测主角的的位置是否发生改变,若改变了则在新位置上重画主角的图。
2.通过检测WM_TIMER消息,以决定是否调用有关函数。
即是每隔一段时间(若干个时钟周期),检测一次,然后决定函数的调用与否。
在上面的两种方法里,第一种是现在较常用的,它的缺点是CPU资源占用相对较多,但对不同的机型适应性较强,较稳定。
第二种在一些较老的游戏或对速度要求不高的游戏中较常见,与第一种相比它的CPU资源占用相对较少,但在不同的机型中表现差异极大。
在谈WinMain()的编制时,窗口函数(WINPROC)的编制是必须说的。
窗口函数可以说是把功能不同的函数通过Switch-Case结构连起来组成一个复杂程序的线索。
它的基本编写方法在Windows编程基础中我们就已经谈到了。
仔细阅读例程中的MainWndProc()函数相信对您是有相当大的帮助的。
/*
*MainWndProc
*
*CallbackforallWindowsmessages
*/
longFARPASCALMainWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
PAINTSTRUCTps;
HDChdc;
switch(message)
{
caseWM_SIZE:
caseWM_MOVE:
if(IsIconic(hWnd))
{
Msg("FoxBearisminimized,pausing");
PauseGame();
}
if(bFullscreen)
{
SetRect(&rcWindow,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
}
else
{
GetClientRect(hWnd,&rcWindow);
ClientT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 开发 基础