pc游戏编程基础篇:《游戏编程》第一部 基础篇



目录:
   零、基础篇
   、游戏动画原理
   2、基于动画原理提高
   3、游戏基石: 窗口 建立
   4、游戏制作利器: 引擎 选择

文章内容:

零、基础篇


   有了个目标的后往往人们比较有信心和动力所以我重新修改了下教程安排在这儿插入了“零”篇

   在基础篇里我们将逐步学习有关游戏制作基本知识为后续开发工作奠定基础那么在基础篇结束时候我们可以弄出个什么东西呢?我们看图:
 



  这是我写个演示截图暂时定为我们基础篇教程目标

   该演示包含了些基本要素如: Windows 基本框架、DirectDraw 基本使用思路方法、精灵使用和 些简单有关 DirectInput 东西但是这个没有对障碍和遮挡进行处理也就是说人物会走到任何地方去些有关地图方面知识我将会放到提高篇里

注:
   本范例在以下环境中通过:VC6.0、DirectX 7.0/8.1 SDK、Win2000/WinXP

附件:
   介绍说明 [本范例演示下载]



、游戏动画原理

   其实现在网上有关游戏编程技术文章越来越多了但是我发现有关最基本了解游戏文章还是比较少大多数文章是以 DirectX 作为开始教学起始因此我觉得花点时间写下这篇文章还是值得今天我就开始介绍些有关游戏编程基础东西以便大家能够真正开始了解游戏从而能够很快转入游戏开发由于是针对新手如果您已经转入编写阶段您完全可以抛开了我将采用种区别于网络上现有教学思路方法来讲下游戏开发奥秘:)

   大家可以看到游戏中主角连贯出招动作、华丽场景、震撼战斗效果切似乎很难让人想象是如何实现也许您在上课无聊时候尝试过在课本角上画上几个人物动作分解图然后遍又遍地翻着它觉得很好玩其实您已经在无形的中接触了游戏动画基本原理其实游戏动画步骤可以想象成这样:

   手中拿着两张纸张放在后面其实这个就是 DirectDraw 两个成员我们先把个分解动作画在背后那张纸上那么我们当前看到就是个“白屏”而已然后我们“快速地”将后面那张纸拿到前面来呵呵你现在看到是第个分解动作了吧!那么如何“快速地”呢?不要紧张这些问题都被 DirectDraw 完美解决了别急今后会详细讲解现在当前两张纸已经交换了而且也看到了动作(个静态而已)那么后面“白纸”如何办呢?我们先拿“橡皮”将纸擦然后将第 2个分解图画上接下来?呵呵自己干吧应该明白了吧经过再次交换我们已经在屏幕上看到第 2个动作了我们继续把后面纸擦干净再画第 3个动作再交换继续下去......由于我们“快速地”动作相当快所以感觉不到有任何问题

   或许有人会问:为什么不直接在第张纸上进行“擦->画->擦->画”动作呢?这个就是为了我们平常所说“闪屏”问题而进行解决方案由于直接进行动作速度相对较慢有时用户会在屏幕上看到现象我们用“两张纸”就完美解决了这个问题(啊?还闪屏?呵呵你小子把显示器坏了问题都怪我啊·#¥%……*)



2、基于动画原理提高

   既然上面游戏“内幕”已经掌握那么我们来看看在上节中涉及“武器”和基本知识或许本篇所涉及东西是基于理论多数但是这将为理解在后面即将写部分会打下很好基础所以咬咬牙看完吧!(啊?没有牙了啊?大家应该鼓掌吧!连牙都没有长齐“3、4点种太阳”都开始学习了你们还有理由吗?恩?是大娘啊?那更应该值得学习了!跑题:)
 
   首先要介绍位主角是 Windows 编程中必要元素: RECT 是英语 rectangle 简写意思是矩形它有什么用呢?我们在上面不是讲到了动作分解动作吗?我们看右图:

   这个图就是个简单行走动作分解图复杂可能有10帧左右哦:)那么如何在中实现自动在纸上画出正确图片呢?(其实我直在考虑是否将这部分内容加上实在太基本了但是每个人都这么想基础谁来教呢?算了让别人口水淹死我吧!)假设您已经有点 C 语言基础了这个教我教说不过去吧:)请看下面代码:


# m_Width 32 // 每个动作 宽度
# m_Height 48 // 每个动作 高度
 



void ShowThePic
{
RECT rect; // 矩形对象用于精确定位所要当前动作
CurrentFrame = 0; // 当前动作编号
Direction = 0; // 当前方向
rect.top = Direction; rect.bottom = (Direction+1)*m_Height; // 对当前矩形大小定义数学问题哦
rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width; // 根据英文意思也可以知道在给谁赋值
BltPicToScreen; // 个伪作用是将当前矩形内图形复制到屏幕上
CurrentFrame;


( CurrrentFrame3 )
CurrentFrame = 0; // 这个步骤能够保证动作循环
}

   不知道这么个你能否看懂的所以要采用 静态变量我们这个要循环运行如果直接写个 每次执行都会被赋回原值 0那么图片就不会变了

   上面这段代码其实并不是那么理想自己在那儿个劲地运行完全没有我们控制份儿别急!来看下面这份修改过伪代码:

# m_Width 32 // 每个动作 宽度
# m_Height 48 // 每个动作 高度

void ShowThePic
{
RECT rect; // 矩形对象用于精确定位所要当前动作
CurrentFrame = 0; // 当前动作编号
Direction = 0; // 当前方向
rect.top = Direction; rect.bottom = (Direction+1)*m_Height; //对当前矩形大小定义数学问题哦
rect.left = CurrentFrame; rect.right = (CurrentFrame+1)*m_Width; //根据英文意思也可以知道在给谁赋值
BltPicToScreen; // 个伪作用是将当前矩形内图形复制到屏幕上

( LeftArrowDown ) // 如果 左箭头 被按下
{
Direction = 1; // 赋值方向为 1
CurrentFrame;
}

( RightArrowDown )
{
Direction = 3;
CurrentFrame;
}

( UpArrowDown )
{
Direction = 2;
CurrentFrame;
}

( DownArrowDown )
{
Direction = 0;
CurrentFrame;
}

(CurrrentFrame3)
CurrentFrame = 0; // 这个步骤能够保证动作循环
}

   经过这么修改问题再次得到解决上面代码就能够响应用户操作了当然你这么直接在里输入这些代码是不行:)是“伪代码”你得根据实际情况自己相应地做些修改才能使运行!

   (题外话:不晓得这么进行教学你是否能够积累到知识?这种教程是不是合适?请到论坛内发表意见我真很想能够摸索出大家接受思路方法有利教学)

   欢迎回到教程中来!有人或许会问为什么这么麻烦要把图形放在这么个图片里头个动作个图啊?呵呵想想那要多少图片啊很难于管理况且这样并不能避免使用这种常用手法 RECT 已经是个成员游戏里不能不用他

   哇口水干了(其实是手累了:)我们下回再见吧

   下回预告:
   少年侦探柯南为了查清楚事情真相他......(?还真预告啊?)
   不好意思习惯性用语了:)在下回我会讲如何将今天代码整合到中去



3、游戏基石: 窗口 建立

   Welcome back!很高兴再次和你相遇教程废话不多说继续

   上次代码片段说实在拿在手里没有用为啥?不能运行啊:)我们这次就按照上次安排讲如何将显示图片代码片段整合到让它能够具体体现出来

   我将在这儿讨论 Windows 编程而不是 MFC 有关 MFC 和 Windows 区别和各自优点我们不多涉及了 MFC 就是微软个封装开发库极大程度降低了 Windows 开发复杂但是我们还是继续 Windows 编程呵呵

   我们来看个基本 Windows 个窗口对吧:)我们所玩游戏其实也是有窗口只不过是看不见而且被 DirectDraw 掩盖了而已那么如何创建个窗口呢?我们来看:

BOOL Init(HINSTANCE hInst, nCmdShow)
{
HWND hWnd; // 窗口句柄就是个储存窗口对象
WNDCLASS WndClass; // 用于注册窗口对象

WndClass.style = CS_HREDRAW | CS_VREDRAW; // 定义窗口类型
WndClass.lpfnWndProc = WinProc; // 指定了窗口消息处理 ** 关键!
WndClass.cbClsExtra = 0; // 没有特定意义
WndClass.cbWndExtra = 0; // 没有特定意义
WndClass.hInstance = hInst; // 窗口例子
WndClass.hIcon = LoadIcon(hInst, IDI_APPLICATION); // 指定窗口图标
WndClass.hCursor = LoadCursor(hInst, IDC_ARROW); // 指定指针
WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 指定背景色为黑色
WndClass.lpszMenuName = NULL; // 指定菜单为无游戏不需要
WndClass.lpszClassName = \"GDIM_GAME_ENGINE\"; //这个注册名字


RegisterClass(&WndClass); // 注册

hWnd = CreateWindowEx(WS_EX_TOPMOST, \"GDIM_GAME_ENGINE\", \"GDIM_GAME\", WS_POPUP, 112, 84, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, hInst, NULL);
// 这段代码就是实现了个窗口创建
// 我们可以通过来检测是否创建成功如果失败将返回个 FALSE
(!hWnd) FALSE;
ShowWindow(hWnd, nCmdShow); // 显示窗口
UpdateWindow(hWnd); // 更新窗口
}

   好了到这儿呢我们就成功创建了个窗口我们回头看我注了“**”地方有关这个我们得写个同名来处理 Windows 消息呵呵不好意思再看:

BOOL bActive = FALSE; // 用于判断是否运行变量

long PASCAL WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
WM_ACTIVATE:
bActive = TRUE; // 当被激活时赋值 TRUE
;
WM_SETCURSOR:
SetCursor(NULL); // 设定鼠标为不显示
TRUE;
WM_KEYDOWN:
switch(wParam)
{
VK_ESCAPE: // 处理按下 ESC 键反应
PostMessage(hWnd, WM_CLOSE, 0, 0); // 发送个关闭窗口命令
;
}
;
WM_DESTROY: // 在窗口即将销毁时反应
PostQuitMessage(0); // 发送个结束消息必须
;
}
DefWindowProc(hWnd, message, wParam, lParam); // 些没有像上面样具体定义消息处理
}

   这个就是用来处理 Windows 消息个标准必要

   再来最后个重要不好意思哦实在是不想这么写但是想想在这个结束后你就可以实现个具体窗口了哦:)

PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, nCmdShow)
{
MSG msg; // 定义个消息对象

(!Init(hInst, nCmdShow)) FALSE; // 还记得上面那个吗?

while(1) // 循环
{
(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) // 不要特别注意
{
(!GetMessage(&msg, NULL, 0, 0 ))
msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
(bActive) // 就是上面是否激活”变量判断
{
ShowThePic; // 显示人物图片上节内容就是整合在这儿
}
WaitMessage; // 没有消息时就等消息:)
}
}

   其实到这儿个简单已经可以出炉了:)编译运行你将看到个黑色窗口这个窗口区别于窗口它没有平常标题栏这个才是适合我们游戏我在这儿给出完整代码但是无法将上节内容以形式表现出来涉及到了 DirectDraw 我不想过多在教程中涉及未讲知识那样会影响对现有知识理解

   下章教程我将开始介绍 DirectDraw 了以便能尽快将显示内容整合同时我会保持教程和代码详尽

注:
   本范例在以下环境中通过:VC6.0、DirectX 7.0/8.1 SDK、Win2000/WinXP

附件:
   介绍说明 [本篇代码下载]


4、游戏制作利器: 引擎 选择

   真很高兴能够继续我们教程大家也定等了许久了怪我太懒

   上次我们讲到了窗口建立并且附带了源代码不知道大家有没有编译和运行不是当老师唠叨哦大家定要试试电脑这个东西尤其是编程要不断地实战才能掌握

   今天我们来点轻松不涉及代码我们来次“纸上谈兵”我今天是要大家选择适合自己游戏引擎曾经有很多网友问我:“引擎 ”到底是什么东西?我也回答过许多遍了但是我从没有嫌烦过我也是这么过来的所以取名叫“引擎”他就像汽车的类 Automobile 得有个家伙驱使他工作而游戏引擎呢他就负责接受用户输入交付自己内部工作机构处理并最终以声音、图像等形式表现出来



   现在大家在网络上可以看到、并且下载到许多免费游戏引擎其中有2D也有时下流行3D国内有许多网站WebSite也在制作各自引擎有个别确有很高效率而且使用很方便比如 云风 “风魂游戏开发库”这些引擎都是将我们今后会碰到 DirectDraw、DirectInput、DirectPlay 等等 DirectX 部件整合封装使其便于使用像我其实自己也在使用别人引擎来开发自己游戏制作库那么你该选择如何样引擎呢?我觉得这个完全取决于你对游戏开发耐心及专研

   现在DirectX 已经发展到了 9.0 而且在 8.1 开发库中我们很高兴看到微软也已经封装了以前繁琐步骤因此DirectX 8.1b 开发库不失为个比较好基层为什么说他还只是个基层呢?他还没有像著名 CDX 那样有比较高级效果封装在里头CDX 是我比较喜欢封装库他不仅使用简便而且可以实现使用频率比较高功能比如 Alpha 混合虽然他不像其他引擎来得功能强大但是他用于自己研究和扩充是很好通过使用 CDX 你对 DirectX 可以有个比较理性认识

   到这儿大家应该发现了我们以前公布教程目录和今天对不上号我发现现在其实有好多网站WebSite都有有关 DirectDraw 编程辅导而且资源丰富我相信大家通过好好分析这些代码然后大量实战就会打造你比较坚固 DirectDraw 编程基础了

   我们今后教程往哪个方向走我正在考虑我也很想看到大家好建议作为个游戏编程入门者你最想看到如何样文章?哪怕是个不明白地方都可以提出来我可以做专题来给大家讲解DirectDraw 方面专题在近期是不会出现了还请大家见谅!

   最后告诉大家个可能算是比较好消息我们教程游戏还在更新和完善的中哦...


待续……



Tags:  游戏编程 pc游戏编程基础篇

延伸阅读

最新评论

发表评论