📄 游戏开发中心----游戏实验室 - 博客园.htm
字号:
size=2> GDI+的C++接口中包括大约40个类、50个枚举和6个结构。听起来虽然不多,但是这也足够胜任大多数应用了。<BR> GDI编写程序的优点是他基本上兼容所有的显示设备,但是这是以损失效率为代价的。通常,编写应用程序时,大多数桌面应用程序用到的只是相对稳定的图形图像显示,所以在这种情况下,使用GDI是很实用的。<BR>可是,在开发对图形图像显示速度要求非常高的游戏程序时,GDI就显得不够强劲了。所以,我们把开发游戏的图形图像显示部分的重担交给了下面就要介绍的DirectX。<BR><BR>GDI学习参考:《Windows
Program With
MFC》中的GDI部分。<BR><BR><B>2.DirectX</B><BR> 谈到DirectX或许你不会陌生,因为像很多大名鼎鼎的FPS游戏都是用它来开发的。这其中有Valve小组的Half
Life及其衍生作品--CS。所以,DirectX已经成为了游戏开发所不可或缺的重要组成部分。<BR><BR>还是先让我们看一个小程序。<BR><BR><B>[program
MovePicture v0.3]</B></FONT></P>
<TABLE id=AutoNumber5 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=212
src="游戏开发中心----游戏实验室 - 博客园.files/GD-txtx_3.jpg" width=282
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 这个程序是用DirectDraw开发的,看到它的威力了吧,滚动的平滑,丝毫没有跳帧的感觉。要是使用GDI编写一个需要重绘直线的程序,其重绘的图形将惨不忍睹。<BR><BR><B>[program
Line Star]</B></FONT></P>
<TABLE id=AutoNumber6 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=270
src="游戏开发中心----游戏实验室 - 博客园.files/GD-txtx_4.jpg" width=270
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 在演示这个程序之前,需要调整一下Windows窗口显示设置。首先鼠标右键点击桌面->属性->外观->效果,将"托动时现实窗口内容"选项选中。这样可以保证在托动窗口的时候,屏幕使用GDI不断刷新。<BR><BR> 由于程序窗体中所绘制的五角星是随着窗体大小而改变的,这样随着窗体的增大或缩小,图形也随之改变。我们都知道,动画的产生原理是,不断以较小幅度改变原来的图像,这样形成的图形序列便产生了动画。所以,在拓东窗体的同时,GDI在不断的绘制新的图形,其绘图性能便可以被我们所看到了。无论多快的硬件设备,只要你拖动的速度快一点,你所见到的一定是五角星在一闪一闪的变化。<BR><BR><A
href="http://tack.smice.net/download/file/game/game.rar">点击这里下载本文章相关程序</A><BR><BR>通过比较,我们可以看出DirectX的优势所在了。<BR><BR>DirectX
学习参考:DirectX SDK</FONT></P></TD></TR></TBODY></TABLE></DIV>
<DIV class=postFoot>posted @ <A title=permalink
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371781.html">2006-04-10
23:48</A> 3vgame 阅读(951) | <A title="comments, pingbacks, trackbacks"
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371781.html#FeedBack">评论
(1)</A> | <A
href="http://www.cnblogs.com/3vgame/admin/EditPosts.aspx?postid=371781">编辑</A>
</DIV></DIV><BR>
<DIV class=post>
<DIV class=postTitle><A
id=homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl01_TitleUrl
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371780.html">《游戏编程》第一部
基础篇</A> </DIV>
<DIV class=postText>
<TABLE id=AutoNumber2 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="85%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><B><FONT color=#ffffee>《游戏编程》第一部 </FONT><FONT
color=#339933>基础篇</FONT></B></P></TD></TR>
<TR>
<TD width="100%"> </TD></TR>
<TR>
<TD width="100%"><FONT size=2>目录:<BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#零、基础篇的目的"
target=_self>零、基础篇的目的</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#一、游戏的动画原理"
target=_self>一、游戏的动画原理</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#二、基于动画原理的提高"
target=_self>二、基于动画原理的提高</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#三、游戏的基石: 窗口 的建立"
target=_self>三、游戏的基石: 窗口 的建立</A><BR> <A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase.htm#四、游戏制作利器: 引擎 的选择"
target=_self>四、游戏制作利器: 引擎 的选择</A><BR><BR>文章内容:<BR></FONT><B><BR><A
name=零、基础篇的目的>零、基础篇的目的</A></B><FONT
size=2><BR><BR> 有了一个目标之后,往往人们比较有信心和动力。所以,我重新修改了一下教程的安排,在这儿插入了“零”篇。<BR><BR> </FONT><FONT
face="Verdana, Tahoma, Arial"
size=2>在基础篇里,我们将逐步学习关于游戏制作的基本知识,为后续的开发工作奠定基础。那么,在基础篇结束的时候,我们可以弄出个什么东西呢?我们看图:<BR> </FONT>
<TABLE id=AutoNumber3 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="100%">
<P align=center><IMG height=502
src="游戏开发中心----游戏实验室 - 博客园.files/gpBase_1.jpg" width=670
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT
size=2> 这是我写的一个演示程序的截图,暂时定为我们基础篇教程的目标。<BR><BR> 该演示程序包含了一些基本要素,如: Windows
程序的基本框架、DirectDraw 的基本使用方法、精灵的使用和 一些简单的关于 DirectInput
的东西。但是,这个程序没有对障碍和遮挡进行处理,也就是说,人物会走到任何地方去。因为一些关于地图方面的知识,我将会放到提高篇里。<BR><BR>注:<BR> 本范例在以下环境中通过:VC6.0、DirectX
7.0/8.1 SDK、Win2000/WinXP <BR><BR>附件:<BR> 说明 [<A
href="http://dev.gameres.com/Program/Abstract/Thinking/gpBase_sample.zip">本范例演示程序下载</A>]<BR><BR><BR><BR></FONT><B><A
name=一、游戏的动画原理>一、游戏的动画原理</A></B><FONT
size=2><BR><BR> 其实现在网上关于游戏编程的技术文章越来越多了,但是我发现关于最基本的了解游戏的文章还是比较少的。大多数文章是以
DirectX
作为开始教学起始的,因此,我觉得花点时间写下这篇文章还是值得的。今天,我就开始介绍一些关于游戏编程的基础东西,以便大家能够真正的开始了解游戏,从而能够很快的转入游戏开发。由于是针对新手的,如果您已经转入程序编写阶段,您完全可以抛开了。我将采用一种不同于网络上现有的教学方法,来讲一下游戏程序开发的奥秘:)<BR><BR> 大家可以看到游戏中主角连贯的出招动作、华丽的场景、震撼的战斗效果,这一切似乎很难让人想象程序是怎么实现的。也许您在上课无聊的时候尝试过在课本的角上画上几个人物动作的分解图,然后一遍又一遍地翻着它,觉得很好玩。其实您已经在无形之中接触了游戏动画的基本原理。其实游戏动画的步骤可以想象成这样:<BR><BR> 手中拿着两张纸,把一张放在后面。其实这个就是
DirectDraw
的两个成员。我们先把一个分解动作画在背后的那张纸上。那么,我们当前看到的就是一个“白屏”而已。然后,我们“快速地”将后面的那张纸拿到前面来。呵呵,你现在看到的是第一个分解动作了吧!那么,怎么“快速地”呢?不要紧张,这些问题都被
DirectDraw
完美的解决了,别急,今后会详细的讲解的。现在,当前的两张纸已经交换了,而且也看到了动作(一个静态的而已),那么后面的“白纸”怎么办呢?我们先拿“橡皮”将纸擦一遍,然后,将第二个分解图画上,接下来?呵呵,自己干吧,应该明白了吧。经过再次的交换,我们已经在屏幕上看到第二个动作了。我们继续把后面的纸擦干净,再画第三个动作,再交换,继续下去......由于我们的“快速地”动作相当快,所以感觉不到有任何问题。<BR><BR> 或许有人会问:为什么不直接在第一张纸上进行“擦->画->擦->画”的动作呢?这个就是为了我们平常所说的“闪屏”问题而进行的解决方案。由于直接进行动作,速度相对较慢,有时用户会在屏幕上看到一闪一闪的现象。我们用“两张纸”的话,就完美的解决了这个问题。(啊?还闪屏?呵呵,你小子把显示器坏了的问题都怪我啊·#¥%……*)<BR><BR><BR><BR></FONT><B><FONT
face=Arial><A name=二、基于动画原理的提高>二、基于动画原理的提高</A></FONT></B><FONT face=Arial
size=2><BR><BR> 既然上面的游戏的“内幕”已经掌握,那么我们来看看在上一节中涉及的“武器”和基本知识。或许本篇所涉及的东西是基于理论的多数,但是,这将为理解在后面即将写的程序部分会打下很好的基础的。所以咬咬牙,看完吧!(啊?没有牙了啊?大家应该鼓掌吧!连牙都没有长齐的“3、4点种的太阳”都开始学习了,你们还有理由吗?恩?是大娘啊?那更应该值得学习了!跑题:)<BR> </FONT>
<TABLE id=AutoNumber4 style="BORDER-COLLAPSE: collapse" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="72%"><FONT face=Arial
size=2><BR> 首先要介绍的第一位主角是 Windows 编程中的必要元素: RECT 。是英语 rectangle
的简写,意思是矩形。它有什么用呢?我们在上面不是讲到了动作的分解动作吗?我们看右图:<BR><BR> 这个图就是一个简单的行走动作分解图,复杂的可能有10帧左右哦:)那么怎么在程序中实现自动在纸上画出正确的图片呢?(其实我一直在考虑是否将这部分内容加上,因为实在太基本了。但是每个人都这么想的话,基础的谁来教呢?算了,让别人的口水淹死我吧!)假设您已经有点
C++ 语言的基础了。这个教我教的话,说不过去吧:)请看下面的代码:<BR><BR><BR></FONT></FONT><FONT
face=宋体 color=#99ccff size=2>#define m_Width
32 </FONT><FONT face=宋体 color=#808080 size=2>// 每个动作的 宽度
</FONT><FONT face=宋体 color=#99ccff size=2><BR>#define m_Height
48 </FONT><FONT face=宋体 color=#808080 size=2>// 每个动作的 高度
</FONT><FONT face=Arial size=2><BR> </FONT></TD>
<TD width="28%">
<P align=center><IMG height=192
src="游戏开发中心----游戏实验室 - 博客园.files/gpBase_2.bmp" width=96
border=0></P></TD></TR></TBODY></TABLE>
<P><FONT face=宋体 color=#99ccff size=2>void ShowThePic()
<BR>{<BR> static RECT
rect;
</FONT><FONT face=宋体 color=#808080 size=2>// 矩形对象,用于精确定位所要的当前动作
</FONT><FONT face=宋体 color=#99ccff size=2><BR> static
int CurrentFrame = 0; </FONT><FONT face=宋体 color=#808080
size=2>// 当前动作的编号</FONT><FONT face=宋体 color=#99ccff size=2>
<BR> static int Direction =
0; </FONT><FONT face=宋体 color=#808080
size=2>// 当前的方向 </FONT><FONT face=宋体 color=#99ccff
size=2><BR> rect.top = Direction; rect.bottom =
(Direction+1)*m_Height; </FONT><FONT face=宋体 color=#808080
size=2> // 对当前矩形的大小定义,数学的问题哦 </FONT><FONT face=宋体
color=#99ccff size=2><BR> rect.left = CurrentFrame;
rect.right = (CurrentFrame+1)*m_Width; </FONT><FONT face=宋体
color=#808080 size=2>// 根据英文的意思也可以知道在给谁赋值 </FONT><FONT face=宋体
color=#99ccff size=2><BR>
BltPicToScreen();
</FONT><FONT face=宋体 color=#808080 size=2>// 一个伪函数,作用是将当前矩形内的图形复制到屏幕上。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -