📄 游戏开发中心----游戏实验室 - 博客园.htm
字号:
</SPAN><SPAN>提供了</SPAN><SPAN>3D</SPAN><SPAN>硬件接口。</SPAN></P>
<P><SPAN>DirectSound</SPAN><SPAN>:</SPAN>
<SPAN>立体声和</SPAN><SPAN>3D</SPAN><SPAN>声音效果,同时管理声卡的内存。</SPAN></P>
<P><SPAN>DirectPlay</SPAN><SPAN>:</SPAN> <SPAN>支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。</SPAN></P>
<P><SPAN>DirectInput</SPAN><SPAN>:</SPAN> <SPAN>为大量的设备提供输入支持。</SPAN></P>
<P><SPAN>DirectSetup</SPAN><SPAN>:</SPAN>
<SPAN>自动安装</SPAN><SPAN>DirectX</SPAN><SPAN>驱动程序。</SPAN></P>
<P><SPAN>随着</SPAN><SPAN>DirectX</SPAN><SPAN>版本的提高,还增加了音乐播放的</SPAN><SPAN>DirectMusic</SPAN><SPAN>。</SPAN></P>
<P><SPAN>3.AlphaBlend </SPAN><SPAN>技术</SPAN> </P>
<P><SPAN>现在许多游戏为了达到光影或图象的透明效果都会采用<SPAN>AlphaBlend
技术。所谓AlphaBlend技术,其实就是按照"Alpha"混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。在计算机中的图象可以用R(红色),G(绿色),B(蓝色)三原色来表示。假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明),Alpha混合公式如下</SPAN></SPAN><SPAN>:</SPAN></P>
<P><SPAN>R(C)=alpha*R(B)+(1-alpha)*R(A)<SPAN>
</SPAN></SPAN></P>
<P><SPAN>G(C)=alpha*G(B)+(1-alpha)*G(A) </SPAN></P>
<P><SPAN>B(C)=alpha*B(B)+(1-alpha)*B(A)</SPAN></P>
<P><SPAN>R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果。
</SPAN></P>
<P><SPAN>4</SPAN><SPAN>.</SPAN><SPAN>A*算法 </SPAN></P>
<P><SPAN>在许多游戏中要用</SPAN><SPAN>鼠标控制人物运动,而且让人物从目前的位置走到目标位置应该走最短的路径。这就要用到最短路径搜索算法即</SPAN><SPAN>A*</SPAN><SPAN>算法了。</SPAN><SPAN>
</SPAN></P>
<P><SPAN>A*算法实际是一种启发式搜索,所谓启发式搜索,就是利用一个估价函数评估每次的的决策的价值,决定先尝试哪一种方案。如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
</SPAN></P>
<P><SPAN>f(n) = g(n) + h(n)</SPAN><SPAN> </SPAN></P>
<P><SPAN>这里,<SPAN>f(n)是节点n的估价函数,g(n)是起点到终点的最短路径值,h(n)是n到目标的最断路经的启发值。由于A*算法比较复杂,限于篇幅,在此简单介绍一下,具体理论朋友们可以看人工智能方面的书籍了解详细的情况。</SPAN></SPAN><SPAN>
</SPAN></P>
<P><SPAN>其它技术还有粒子系统,音频与视频的调用,图象文件的格式与信息存储等,大家可以在学好</SPAN><SPAN>DirectX</SPAN><SPAN>的基础上逐渐学习更多的技术。</SPAN></P>
<P><SPAN>(二)游戏的具体制作</SPAN></P>
<P><SPAN> </SPAN><SPAN>1.</SPAN><SPAN>地图编辑器的制作</SPAN></P>
<P><SPAN>RPG游戏往往要有大量的场景,场景中根据需要可以有草地,湖泊,树木,房屋,家具等道俱,由于一个游戏需要很多场景且地图越来越大,为了节省空间,提高图象文件的可重用性,RPG游戏的画面采用很多重复的单元(可以叫做“图块”)所构成的,这就要用到地图编辑器了。我们在制作游戏引擎前,要完成地图编辑器的制作。在
RPG游戏里,场景的构成,是图块排列顺序的记录。首先制定一个场景构成文件的格式,在这个文件里记录构成场景所需要的图块的排列顺序,因为我们已经为每个图块建立了索引,所以只需要记录这些索引就可以了。一个场景的构成,是分成几层来完成的:地面,建筑和植物,家具摆设,和在场景中活动的人物或者物体(比如飘扬的旗帜),按照一定的顺序把它们依次显示到屏幕上,就形成了一个丰富多采的场景。我们可以用数组来表示地图场景的生成过程。</SPAN></P>
<P><SPAN>MapData[X][Y]; //地图数据,X表示地图宽度,Y表示地图高度</SPAN></P>
<P><SPAN>Picture[num]; //道具的图片,num表示道具的总数</SPAN></P>
<P><SPAN>void MakeBackGround() //生成场景函数</SPAN></P>
<P><SPAN>{</SPAN> </P>
<P> <SPAN>int n;</SPAN></P>
<P><SPAN>for( int i=0; i<Y; i++) //共Y行</SPAN></P>
<P><SPAN>for( int j=0; j<X; j++) //共X列</SPAN></P>
<P><SPAN>{</SPAN></P>
<P><SPAN>n=MapData[ i ][ j ]; //取得该位置的道具编号</SPAN></P>
<P><SPAN>Draw( j*32, i*32, Picture[n]); //在此位置(j*32,i*32)画道具</SPAN></P>
<P><SPAN>}</SPAN></P>
<P><SPAN>}</SPAN></P>
<P><SPAN> 2</SPAN><SPAN>.<SPAN>游戏的模块的划分</SPAN></SPAN><B><SPAN>
</SPAN></B></P>
<P><SPAN> 游戏按功能分为:消息处理系统、场景显示及行走系统、打斗系统三大主要部分。其中又以消息处理系统为核心模块,其余部分紧紧围绕它运行。<SPAN>
</SPAN></SPAN></P>
<P><SPAN> 一:消息处理系统<SPAN> </SPAN></SPAN></P>
<P><SPAN>
消息处理系统是游戏的核心部分。游戏用到的</SPAN><SPAN>消息处理系统先等待消息,然后根据收到的消息转到相应的函数进行处理。比如:主角碰到敌人后,我们就让程序产生‘打斗消息’,消息处理系统收到这个消息后就会马上转到打斗模块中去。消息处理的大体框架如下:<SPAN>
</SPAN></SPAN></P>
<P><SPAN> //定义程序中要用到的变量 </SPAN></P>
<P><SPAN> DWORD Message; //消息变量 </SPAN></P>
<P><SPAN> WinMain() //进入程序 </SPAN></P>
<P><SPAN> { 初始化主窗口; </SPAN></P>
<P><SPAN> 初始化<SPAN>DirectDraw环境,并调入程序需要的图形、地图数据;
</SPAN></SPAN></P>
<P><SPAN> while( 1 ) //消息循环 </SPAN></P>
<P><SPAN> { switch( Message ) </SPAN></P>
<P><SPAN> { case 行走消息: 行走模块(); </SPAN></P>
<P><SPAN> case 打斗消息: 打斗模块(); </SPAN></P>
<P><SPAN> case 事件消息: 事件模块(); </SPAN></P>
<P><SPAN> } </SPAN></P>
<P><SPAN> } </SPAN></P>
<P><SPAN>} </SPAN></P>
<P><SPAN> 二:场景显示及行走系统<SPAN> </SPAN></SPAN></P>
<P><SPAN>作为</SPAN><SPAN>RPG</SPAN><SPAN>游戏,其所有事件的发生几乎都是和场景有关,例如:不同的地方会碰到不同的敌人、与不同的人对话得知不同的事情等。鉴于这部分的重要性,我们可再将它划分为:<SPAN>背景显示、行走</SPAN></SPAN><B><I>
</I></B><SPAN>和</SPAN> <SPAN>事件发生</SPAN><B><I>
</I></B><SPAN>三个子模块,分别处理各自的功能。下面进行具体分析。</SPAN></P>
<P><SPAN> (一)背景显示<SPAN> </SPAN></SPAN></P>
<P><SPAN>程序运行后,先读取前面地图编辑器制作的场景所需要的图块的排列顺序,按照排列顺序将图象拼成一个完整的场景,一般做法是:在内存中开辟一到两个屏幕缓存区,事先把即将显示的图象数据准备在缓存区内,然后一次性搬家:把它们传送到真正的屏幕缓冲区内。<SPAN>
</SPAN></SPAN></P>
<P><SPAN>游戏用到的图片则事先制作好并存于另外的图形文件中。地图编辑器制作的场景文件仅仅是对应的数据,而不是真正的图片。在游戏中生成场景就是地图编辑的逆过程,一个是根据场景生成数据,而另一个是根据数据生成场景。<SPAN>
</SPAN></SPAN></P>
<P><SPAN> (二)行走<SPAN> </SPAN></SPAN></P>
<P><IMG height=336 hspace=12 src="游戏开发中心----游戏实验室 - 博客园.files/RPGjiaoben.jpg"
width=168 align=left v:shapes="_x0000_s1026">
<SPAN>要让主角在场景中行走,至少要有上、下、左、右四个行走方向,每个方向</SPAN><SPAN>4</SPAN><SPAN>幅图(站立、迈左腿、迈右腿、迈左腿),如图:游戏中一定要将图片的背景设为透明,这样在画人物的时候就不会覆盖上背景色了(这一技术</SPAN><SPAN>DirectDraw中只要用SetColorKey()函数将原图片背景色过滤掉就行了)。我们让主角位置不动,而使场景移动,即采用滚屏技术来实现角色在场景上移动。这样角色一直保持在屏幕的正中间,需要做的工作只是根据行走方向和步伐不停变换图片而已。行走时的障碍物判断也是每一个场景中必定要有的,有一些道具如树木、房屋等是不可跨越的。对此我主要用一个二维数组来对应一个场景,每一个数组值代表场景的一小格(见图3)。有障碍的地方,该数组的对应值为1,可通过的地方的值为0。
</SPAN></P>
<P><SPAN>(三)事件发生<SPAN> </SPAN></SPAN></P>
<P><SPAN>事件发生原理就是把相应事件的序号存储在地图的某些格子中,当主角一踏入这个格子就会触发对应事件。例如:在游戏开始时,主角是在他的家里。他要是想出去的话,就需要执行场景切换这个处理函数。我们假定该事件的编号为<SPAN>001,那么在地图上把家门外路口处的格子值设为001。这样主角走到路口时,编号为001的场景切换函数就会被触发,于是主角便到了下一个场景中。程序具体如下:
</SPAN></SPAN></P>
<P><SPAN> void MessageLoop( int Msg ) //消息循环
</SPAN></P>
<P><SPAN> {switch( Msg ) </SPAN></P>
<P><SPAN> {char
AddressName[16]; //数组AddressName[16]用来存储主角所在地点的名称 </SPAN></P>
<P><SPAN> case ADDRESS ==
001:<SPAN> </SPAN>// 由ADDRESS的值决定场景值(出门) </SPAN></P>
<P><SPAN> ScreenX=12;
ScreenY=0;<SPAN> </SPAN>//初始化游戏背景位置 </SPAN></P>
<P><SPAN> Hero.x=360; Hero.y=80;//主角坐标
</SPAN></P>
<P><SPAN> Move();//主角移动函数 </SPAN></P>
<P><SPAN> //以下程序用来显示主角所在地点 </SPAN></P>
<P><SPAN> sprintf(AddressName,"下一幅游戏场景的名称");
</SPAN></P>
<P><SPAN> PrintText(lpDDSPrimary, 280,
330,AddressName , RGB(255,255,255));//在屏幕上显示出场景的名称 </SPAN></P>
<P><SPAN> break;} </SPAN></P>
<P><SPAN> } </SPAN></P>
<P><SPAN> 三:打斗系统<SPAN> </SPAN></SPAN></P>
<P><SPAN>绝大多数的<SPAN>RPG都是有战斗存在的,因此,打斗系统就成为RPG系统中很重要的一环。有不少RPG游戏采用回合制打斗方式,因为实现起来较为简单。和打斗紧密相关的是升级,通常在一场战斗结束后,主角的经验值都会增加。而当经验值到达一定程度时,角色就升级了。
</SPAN></SPAN></P>
<P><SPAN>上面我简要的介绍了角色扮演游戏的制作,由于写这篇文章的目的是让读者对角色扮演游戏的制作有一个基本的了解,所以读者朋友们可以研究相关资料。欢迎与各位朋友们讨论游戏制作方面的问题,我的<SPAN>E_mail:</SPAN></SPAN><SPAN><A
href="mailto:creativesoftfan@sina.com">creativesoftfan@sina.com</A>
</SPAN><SPAN>网站</SPAN><SPAN>:</SPAN><SPAN>http://creativesoft.home.shangdu.net</SPAN><SPAN>
</SPAN></P></DIV>
<DIV class=postFoot>posted @ <A title=permalink
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371779.html">2006-04-10
23:46</A> 3vgame 阅读(954) | <A title="comments, pingbacks, trackbacks"
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371779.html#FeedBack">评论
(1)</A> | <A
href="http://www.cnblogs.com/3vgame/admin/EditPosts.aspx?postid=371779">编辑</A>
</DIV></DIV><BR>
<DIV class=post>
<DIV class=postTitle><A
id=homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl03_TitleUrl
href="http://www.cnblogs.com/3vgame/archive/2006/04/10/371778.html">C++源代码游戏编程--WinMain()函数集
</A></DIV>
<DIV class=postText>
<P>C++源代码游戏编程--WinMain()函数集 <BR> <BR> </P>
<P>C++源代码游戏编程--WinMain()函数交流</P>
<P>//******************************************************************<BR>//函数:WinMain()<BR>//功能:应用程序入口<BR>//******************************************************************<BR>int
PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,<BR>LPSTR
lpCmdLine, int nCmdShow)<BR>{<BR> MSG
ms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -