游戏编程的特点

上传人:kms****20 文档编号:40485762 上传时间:2018-05-26 格式:DOC 页数:35 大小:69KB
返回 下载 相关 举报
游戏编程的特点_第1页
第1页 / 共35页
游戏编程的特点_第2页
第2页 / 共35页
游戏编程的特点_第3页
第3页 / 共35页
游戏编程的特点_第4页
第4页 / 共35页
游戏编程的特点_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《游戏编程的特点》由会员分享,可在线阅读,更多相关《游戏编程的特点(35页珍藏版)》请在金锄头文库上搜索。

1、游戏编程的特点游戏编程的特点第七章 游戏编程的特点第一节 概述:电脑游戏在计算机发展使用中可以说扮演了一个极为有趣的角色,一方面不为很多人所赞同,认为是一种浪费;而另一方面电脑游戏却是推动计算机的各项技术迅速发展的最有力的力量之一。这一点,可以从 3d 类游戏对硬件无止境的需求,游戏迷对游戏图像的质量、游戏的交互性、人机界面的友好性等方面的需求体现出来(当然游戏迷对游戏的的构思、创意的要求也是苛刻且无止境的,但这一点只有靠您自己的想象力,我们是爱莫能助了) 。从游戏近期的发展中,我们从 3d 游戏的发展,可以看到从 Doom 到现在的古墓丽影 2、雷神之锤 2,3d 游戏的画面从生硬单调的多边

2、形到今天柔和复杂几进乱真的场景、道具、怪物,敌人从只会疯狂向你冲来到今天会偷袭、会审时度势地采取合适的方式方法向你进攻;游戏无论从硬件支持还是编程技术方面都有突飞猛进的进展。在游戏发展的过程中,很多技术也随之发展起来了,例如各种图形加速卡的出现和发展,directx 的出现,和各个成功游戏中采用的各种优化技术都推动了计算机技术的发展。游戏可以说是集合了每个时期计算机行业中最先进的硬件技术和最新的编程思想,比如近期的游戏都是采用了面向对象的编程思想的基于 Windows 的软件,大部分图象要求高的游戏都要求或支持图形加速卡。同时游戏编程中也有自己基本的方式方法、结构和理论,在这一章的学习中我们将

3、讨论这些问题。在这一章中我们将讨论下面几个问题:程序入口 即是游戏获取外部操作的讯息,得到下次刷新所需的新参数的手段。如同一般的 SDK Windows 应用程序一样,程序的入口为WINMAIN() 。游戏初始化 包括创建标准的 WINDOWS 程序所需的初始化程序以及游戏内部的初始化程序,例如游戏系统初始化、游戏图形的装入、游戏声音的装入等。游戏内部循环: 游戏的循环入口是 WINDOWS 消息循环内部的一个函数调用,游戏内部循环包括刷新游戏单位、画游戏单位两部分。刷新游戏单位: 用于每一帧刷新游戏单位的状态,例如改变游戏单位的状态、改变游戏单位的位置、获取外部信息等。画游戏单位: 用于每一

4、帧往屏幕上画游戏单位的图象,并进行特殊处理以提高速度。计算机人工智能: 主要用于受计算机处理的游戏单位的行为控制算法,程序部分位于刷新计算机游戏单位部分中。游戏内存管理: 这一部分对于优质高效的游戏软件是十分重要的,内存管理不当会导致游戏性能的降低,甚至引起死机。游戏交互设计: 交互设计是游戏可玩性的关键,友好的交互界面和交互方式可以使游戏增色不少。游戏图象底层设计: 游戏软件的主要处理时间花在处理图象和画图象上,所以游戏图象底层的设计对于游戏的最终效果是十分重要的。游戏多媒体设计: 主要包括图形界面设计、游戏音乐音效设计、游戏动画设计、游戏影象设计的几个方面,更广泛的说还包括游戏所有运行过程

5、的功能设计。第二节 程序入口这个标题看起来似乎很难理解,它的意思就是当游戏被启动时,计算机从什么地方开始运行程序的。在 Windows 的应用程序上,Winmain()函数一般就是程序入口。游戏开始后,就调用Winmain()函数,然后再按语句的顺序或所接受到的消息调用相应的函数。从第三章 Windows 编程基础中我们了解到 Winmain()函数的的结构、运行过程,现在我们就游戏编程的角度来讨论 Winmain()函数的编制。int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,i

6、nt nCmdShow )MSGmsg;while( lpCmdLine0 = - | lpCmdLine0 = /)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;br

7、eak;case s:bStretch = TRUE;break;case S:bWantSound = FALSE;break;case x:bStress= TRUE;break;case ?:bHelp= TRUE;bFullscreen= FALSE; / give help in windowed modebreak;while( IS_SPACE(*lpCmdLine) )lpCmdLine+;GameMode.cx = getint(GameMode.cy = getint(GameBPP = getint(/* create window and other windows t

8、hings*/if( !initApplication(hInstance, nCmdShow) )return FALSE;/* Give user help if asked for* This is ugly for now because the whole screen is black* except for the popup box. This could be fixed with some* work to get the window size right when it was created instead* of delaying that work. see dd

9、raw.c*/if( bHelp )MessageBox(hWndMain,“F12 - Quitn“NUMPAD 2 - crouchn“NUMPAD 3 - applen“NUMPAD 4 - rightn“NUMPAD 5 - stopn“NUMPAD 6 - leftn“NUMPAD 7 - jumpn“n“Command line parametersn“n“-e Use emulatorn“-S No Soundn“-1 No backbuffern“-2 One backbuffern“-4 Three backbuffersn“-s Use stretchn“-x Demo o

10、r stress moden“,OUR_APP_NAME, MB_OK );/* initialize for game play*/if( !InitGame() )return FALSE;dwFrameTime = timeGetTime();while( 1 )if (PeekMessage( TranslateMessage( DispatchMessage(else if (!bPaused lastInput=0;elseWaitMessage();if (AveFrameRateCount)AveFrameRate = AveFrameRate / AveFrameRateCo

11、unt;Msg(“Average frame rate: %d“, AveFrameRate);return msg.wParam; /* WinMain */我们知道在消息循环之中只有一个消息-WM_QUIT 可以结束这个循环,退出 WINDOWS。所以我们要在消息循环之前完成所有的工作即所有的初始化。关于初始化这个概念在下一节我们将详细讨论。在我们提供的例程(在光盘的 sample 目录中)中的 foxbear.c 里的WMain()中我们可以看到在消息循环之前先运行 DDint()函数对DirectDraw 进行初始化,检测命令行参数并对相关的参数进行赋值和确定显示模式,进行窗口的初始化

12、,检测 bhelp 的值以确定是否显示帮助对话框,进行游戏的初始化。在一个游戏的消息循环中除了包含一般 Windows 应用程序的消息循环所应包含的部分外还应有调用有关检测游戏单位状态位置、刷新游戏单位和重画新图以及有关人工智能的函数的部分。在例程中的消息循环部分包含了一个关于检测游戏单位状态位置、刷新游戏单位和重画新图函数的调用。在这些调用中一般有两种方法:1.在消息循环中直接调用有关函数。比如说在一个 RPG 的游戏中每个循环都检测主角的的位置是否发生改变,若改变了则在新位置上重画主角的图。2.通过检测 WM_TIMER 消息,以决定是否调用有关函数。即是每隔一段时间(若干个时钟周期) ,

13、检测一次,然后决定函数的调用与否。在上面的两种方法里,第一种是现在较常用的,它的缺点是 CPU 资源占用相对较多,但对不同的机型适应性较强,较稳定。第二种在一些较老的游戏或对速度要求不高的游戏中较常见,与第一种相比它的 CPU 资源占用相对较少,但在不同的机型中表现差异极大。在谈 WinMain()的编制时,窗口函数(WINPROC)的编制是必须说的。窗口函数可以说是把功能不同的函数通过 Switch-Case 结构连起来组成一个复杂程序的线索。它的基本编写方法在 Windows 编程基础中我们就已经谈到了。仔细阅读例程中的 MainWndProc()函数相信对您是有相当大的帮助的。/* Ma

14、inWndProc* Callback for all Windows messages*/long FAR PASCAL MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )PAINTSTRUCT ps;HDC hdc;switch( message )case WM_SIZE:case WM_MOVE:if (IsIconic(hWnd)Msg(“FoxBear is minimized, pausing“);PauseGame();if (bFullscreen)SetRect(elseGetClient

15、Rect(hWnd, ClientToScreen(hWnd, (LPPOINT)ClientToScreen(hWnd, (LPPOINT)Msg(“WINDOW RECT: %d,%d,%d,%d“, rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom);break;case WM_ACTIVATEAPP:bIsActive = (BOOL)wParam if (bIsActive)Msg(“FoxBear is active“);elseMsg(“FoxBear is not active“);/ while we w

16、ere not-active something bad happened that caused us/ to pause, like a surface restore failing or we got a palette/ changed, now that we are active try to fix things/if (bPaused elseif (GetForegroundWindow() = hWnd)/ we are unable to restore, this can happen when/ the screen resolution or bitdepth has changed/ we just reload all the ar

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号