易码技术论坛

 找回密码
 加入易码
搜索
12
返回列表 发新帖
楼主: 霸王屎

★☆★[制作RPG引擎——资料,思路,及其相关方法!]★☆★

[复制链接]
发表于 2006-7-1 09:22:00 | 显示全部楼层
啊~~我等这种贴等了很久了阿

下来好好看看
发表于 2006-7-1 09:24:00 | 显示全部楼层
捎带问一下

我用seestar的工具bmptodata后生成一个dat文件
把它直接传到wqx的LavaData文件夹
用什么代码把它调出来?
我刚学lava,代码都不太会用,能把代码写一下么?
是不是用
    fopen和fread啊?

能把具体的代码写一下么?

万分感谢阿


 楼主| 发表于 2005-9-5 16:07:47 | 显示全部楼层 |阅读模式
首先问几个问题(当然你可以选择不看):
1:在时空引擎里如何实现存档加密(我研究了一下“恶龙”的源码,可惜没研究出来)??具体方法?(如果有相关的帖子,请给个连接,或者说说大致的思路,不过最好还是直接告诉我具体的方法吧。谢谢。)
2:最大生命值上限65535(双字节??)点数是否还可以增加?在引擎里应该怎么操作??
3:如何在时空引擎里实现“溜冰”效果(类似口袋妖怪里的那种)……老F说实现很难,除非对引擎进行大幅度的修改。(最近我有了点思路,比如用 改变ifmove+事件连接+方向障碍物的判定……不过遇到了很多问题,以后我在开个新贴来讨论)
4:能不能说说制作data--数据文件的原理,如何制作,应选用那些工具?(如果有实例就更好了)。这方面我的知识太浅薄……
5:堆栈是什么意思啊?压栈?出栈?……不太明白……

大家如果能帮我解决上面的问题,那就是对本人的最大支持与鼓励,谢谢。


为了此贴不被移走或者删除,特付我搜集的RPG引擎的制作资料与思路
好了,正文开始(以下文章是从各网站搜集来的):如果你想编RPG游戏,但却不知道从何入手,那以下的内容将会给你带来莫大的帮助……  
角色扮演游戏(RPG)是深受广大游戏迷们喜爱的一种游戏, 它以独特的互动性和故事性吸引了无数的玩家。它向人们提供了超出现实生活的广阔的虚拟世界,使人们能够尝试扮演不同的角色,去经历和体验各种不同的人生旅程或奇幻经历。这些体验都是在现实生活中无法实现的。在玩过许多游戏后,许多玩家都不再仅仅满足于一个游戏玩家的身份,而会思考游戏是如何制作的,并且打算制作一个自己的游戏,网上的各种游戏制作小组更是如雨后春笋般涌现。下面我就给大家介绍一下角色扮演游戏引擎的原理与制作,希望能对游戏制作爱好者有所帮助。
  一 游戏引擎的原理
  说到引擎,游戏迷们都很熟悉。游戏引擎是一个为运行某一类游戏的机器设计的能够被机器识别的代码(指令)集合。它象一个发动机,控制着游戏的运行。一个游戏作品可以分为游戏引擎和游戏资源两大部分。游戏资源包括图象,声音,动画等部分,列一个公式就是:游戏=引擎(程序代码)+资源(图象,声音,动画等)。游戏引擎则是按游戏设计的要求顺序的调用这些资源。
  二 角色扮演游戏的制作
  一个完整的角色扮演游戏的制作从大的分工来说可以分为:策划,程序设计,美工,音乐制作以及项目管理,后期的测试等。
  策划主要任务是设计游戏的剧情,类型以及模式等,并分析游戏的复杂性有多大,内容有多少,策划的进度要多快等因素。
  程序设计的任务是用某种编程语言来完成游戏的设计,并与策划配合,达到预期的目的。
  美工主要是根据游戏的时代背景与主题设计游戏的场景及各种角色的图象。
  音乐制作是根据游戏的剧情和背景制作游戏的音乐与音效。
  项目管理主要是控制游戏制作的进程,充分利用现有的资源(人员,资金,设备等),以达到用尽量少的资金实现最大的收益。
  后期的测试也是非常重要的一个环节,对于一个几十人花费几个月甚至是几年时间制作的游戏,测试往往能找到许多问题,只有改进程序才能确保游戏的安全发行。
  由于文章主要是讲解游戏程序的制作的,所以策划,美工,音乐制作等方面请读者参考其它文章,下面我就讲讲游戏程序的设计。
  (一) 开发工具与主要技术
  1.件开发工具
  游戏程序开发工具有很多,在不同游戏平台上有不同的开发工具。在个人计算机上,可以用目前流性的软件开发工具,比如:C,C++,VC++,Delphi,C++ Builder等。由于Windows操作系统的普及和其强大的多媒体功能,越来越多的游戏支持Windows操作系统。由于VC是微软的产品,用它来编写Windows程序有强大的程序接口和丰富的开发资源的支持,加之VC严谨的内存管理,在堆栈上良好的分配处理,生成代码的体积小,稳定性高的优点,所以VC++就成为目前游戏的主流开发工具。
  2.DirectX组件的知识
  谈到Windows系统下的游戏开发,我们就要说一下微软的DirectX SDK。
  Windows系统有一个主要优点是应用程序和设备之间的独立性。然而应用程序的设备无关性是通过牺牲部分速度和效率的到的,Windows在硬件和软件间添加了中间抽象层,通过这些中间层我们的应用程序才能在不同的硬件上游刃有余。但是,我们因此而不能完全利用硬件的特征来获取最大限度的运算和显示速度。这一点在编写Windows游戏时是致命的,DirectX便是为解决这个问题而设计的。DirectX由快速的底层库组成并且没有给游戏设计添加过多的约束。微软的DirectX软件开发工具包(SDK)提供了一套优秀的应用程序编程接口(APIs),这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。
  DirectX的6个组件分别是:
  DirectDraw: 使用页面切换的方法实现动画,它不仅可以访问系统内存,还可以访问显示内存。
  Direct3D: 提供了3D硬件接口。
  DirectSound: 立体声和3D声音效果,同时管理声卡的内存。
  DirectPlay: 支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。
  DirectInput: 为大量的设备提供输入支持。
  DirectSetup: 自动安装DirectX驱动程序。
  随着DirectX版本的提高,还增加了音乐播放的DirectMusic。
  3.AlphaBlend 技术
  现在许多游戏为了达到光影或图象的透明效果都会采用AlphaBlend 技术。所谓AlphaBlend技术,其实就是按照"Alpha"混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。在计算机中的图象可以用R(红色),G(绿色),B(蓝色)三原色来表示。假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,0为完全透明,1为完全不透明),Alpha混合公式如下:
  R(C)=alpha*R(B)+(1-alpha)*R(A)
  G(C)=alpha*G(B)+(1-alpha)*G(A)
  B(C)=alpha*B(B)+(1-alpha)*B(A)
  R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果。
  4.A*算法
  在许多游戏中要用鼠标控制人物运动,而且让人物从目前的位置走到目标位置应该走最短的路径。这就要用到最短路径搜索算法即A*算法了。
  A*算法实际是一种启发式搜索,所谓启发式搜索,就是利用一个估价函数评估每次的的决策的价值,决定先尝试哪一种方案。如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
f(n) = g(n) + h(n)
  这里,f(n)是节点n的估价函数,g(n)是起点到终点的最短路径值,h(n)是n到目标的最断路经的启发值。由于A*算法比较复杂,限于篇幅,在此简单介绍一下,具体理论朋友们可以看人工智能方面的书籍了解详细的情况。
  其它技术还有粒子系统,音频与视频的调用,图象文件的格式与信息存储等,大家可以在学好DirectX的基础上逐渐学习更多的技术。
  (二)游戏的具体制作
  1.地图编辑器的制作
  RPG游戏往往要有大量的场景,场景中根据需要可以有草地,湖泊,树木,房屋,家具等道俱,由于一个游戏需要很多场景且地图越来越大,为了节省空间,提高图象文件的可重用性,RPG游戏的画面采用很多重复的单元(可以叫做“图块”)所构成的,这就要用到地图编辑器了。我们在制作游戏引擎前,要完成地图编辑器的制作。在 RPG游戏里,场景的构成,是图块排列顺序的记录。首先制定一个场景构成文件的格式,在这个文件里记录构成场景所需要的图块的排列顺序,因为我们已经为每个图块建立了索引,所以只需要记录这些索引就可以了。一个场景的构成,是分成几层来完成的:地面,建筑和植物,家具摆设,和在场景中活动的人物或者物体(比如飘扬的旗帜),按照一定的顺序把它们依次显示到屏幕上,就形成了一个丰富多采的场景。我们可以用数组来表示地图场景的生成过程。
MapData[X][Y]; //地图数据,X表示地图宽度,Y表示地图高度
Picture[num]; //道具的图片,num表示道具的总数
void MakeBackGround() //生成场景函数
{
int n;
for( int i=0; i<Y; i++) //共Y行
for( int j=0; j<X; j++) //共X列
{
n=MapData[ i ][ j ]; //取得该位置的道具编号
Draw( j*32, i*32, Picture[n]); //在此位置(j*32,i*32)画道具
}
}  
  2.游戏的模块的划分
  游戏按功能分为:消息处理系统、场景显示及行走系统、打斗系统三大主要部分。其中又以消息处理系统为核心模块,其余部分紧紧围绕它运行。
一:消息处理系统
  消息处理系统是游戏的核心部分。游戏用到的消息处理系统先等待消息,然后根据收到的消息转到相应的函数进行处理。比如:主角碰到敌人后,我们就让程序产生‘打斗消息’,消息处理系统收到这个消息后就会马上转到打斗模块中去。消息处理的大体框架如下:
//定义程序中要用到的变量
DWORD Message; //消息变量
WinMain() //进入程序
{ 初始化主窗口;
初始化DirectDraw环境,并调入程序需要的图形、地图数据;
while( 1 ) //消息循环
{ switch( Message )
{ case 行走消息: 行走模块();
case 打斗消息: 打斗模块();
case 事件消息: 事件模块();
}
}
}  
  二:场景显示及行走系统
  作为RPG游戏,其所有事件的发生几乎都是和场景有关,例如:不同的地方会碰到不同的敌人、与不同的人对话得知不同的事情等。鉴于这部分的重要性,我们可再将它划分为:背景显示、行走 和 事件发生 三个子模块,分别处理各自的功能。下面进行具体分析。
  (一)背景显示
  程序运行后,先读取前面地图编辑器制作的场景所需要的图块的排列顺序,按照排列顺序将图象拼成一个完整的场景,一般做法是:在内存中开辟一到两个屏幕缓存区,事先把即将显示的图象数据准备在缓存区内,然后一次性搬家:把它们传送到真正的屏幕缓冲区内。
  游戏用到的图片则事先制作好并存于另外的图形文件中。地图编辑器制作的场景文件仅仅是对应的数据,而不是真正的图片。在游戏中生成场景就是地图编辑的逆过程,一个是根据场景生成数据,而另一个是根据数据生成场景。
  (二)行走
  要让主角在场景中行走,至少要有上、下、左、右四个行走方向,每个方向4幅图(站立、迈左腿、迈右腿、迈左腿),如图:游戏中一定要将图片的背景设为透明,这样在画人物的时候就不会覆盖上背景色了(这一技术DirectDraw中只要用SetColorKey()函数将原图片背景色过滤掉就行了)。我们让主角位置不动,而使场景移动,即采用滚屏技术来实现角色在场景上移动。这样角色一直保持在屏幕的正中间,需要做的工作只是根据行走方向和步伐不停变换图片而已。行走时的障碍物判断也是每一个场景中必定要有的,有一些道具如树木、房屋等是不可跨越的。对此我主要用一个二维数组来对应一个场景,每一个数组值代表场景的一小格(见图3)。有障碍的地方,该数组的对应值为1,可通过的地方的值为0。
  (三)事件发生
  事件发生原理就是把相应事件的序号存储在地图的某些格子中,当主角一踏入这个格子就会触发对应事件。例如:在游戏开始时,主角是在他的家里。他要是想出去的话,就需要执行场景切换这个处理函数。我们假定该事件的编号为001,那么在地图上把家门外路口处的格子值设为001。这样主角走到路口时,编号为001的场景切换函数就会被触发,于是主角便到了下一个场景中。程序具体如下:
void MessageLoop( int Msg ) //消息循环
{
 switch( Msg )
 {
  char AddressName[16]; //数组AddressName[16]用来存储主角所在地点的名称
  case ADDRESS == 001: // 由ADDRESS的值决定场景值(出门)
   ScreenX=12; ScreenY=0; //初始化游戏背景位置
   Hero.x=360; Hero.y=80;//主角坐标
   Move();//主角移动函数
   //以下程序用来显示主角所在地点
   sprintf(AddressName,"下一幅游戏场景的名称");
   PrintText(lpDDSPrimary, 280, 330,AddressName , RGB(255,255,255));//在屏幕上显示出场景的名称
   break;
 }
}  
  三:打斗系统
  绝大多数的RPG都是有战斗存在的,因此,打斗系统就成为RPG系统中很重要的一环。有不少RPG游戏采用回合制打斗方式,因为实现起来较为简单。和打斗紧密相关的是升级,通常在一场战斗结束后,主角的经验值都会增加。而当经验值到达一定程度时,角色就升级了。
  上面我简要的介绍了角色扮演游戏的制作,由于写这篇文章的目的是让读者对角色扮演游戏的制作有一个基本的了解,所以读者朋友们可以研究相关资料。

#2  RPG脚本之道
  脚本者,RPG之大事也。死生之地存亡之道,故不可不察也!高级游戏编程,特别是RPG脚本起着驱动整个游戏进程的作用。事件的运作建立在脚本的基础上,而脚本的设计建立在引擎的基础上,所以设计脚本之前因该想一想引擎,好的脚本对剧情的描述具有简单、准确的性质。如同编程语言一般高级语言往往简单而无扩张性,低级语言复杂而灵活,故好的脚本亦如C语言一般高低兼顾:
  那么设计什么样的脚本呢?怎样才能准确地描述事件呢,这是最令人头痛的问题捆饶我长达一年之久。我参看了“RPG梦工厂”,老的“仙剑后传”,和几个小型的英文游戏引擎。苦思冥想发现脚本都各有千秋,发现每个脚本都有自己的特点因此我和几个朋友都觉得脚本就应该不拘一格应游戏变化而变化,一个老试RPG“勇者斗恶龙”就只需要相当简单的剧情描述,中等的RPG以事件为中心,脚本为之变难,而复杂者则必须具有复杂的条件判断,指令集合但一般为顺序结构就比较合适了。文章分为两部分1.脚本编译与运行:将从词法,语法分析入手讲解编译然后说程序主循环和脚本运行的搭配问题 2.脚本的设计:同时举列几个我们熟悉游戏的脚本并主要介绍我自己的脚本系统,我只不过还是在尝试所以大家不必陷于我的思路中,更不必刻意仿照,迅速看玩然后忘记,因为读书是为了忘记书("其实我也不大懂")。同时可以参看网友啊辉写的"新仙剑奇侠",和我的"轩辕剑外传II"。在我的主页(http://newbird.126.com) 可以找到。
编译与运行
  这大概属于编译原理了,所以看一看这方面的书是有好处的,虽然有点杀鸡用牛刀。但里面许多思想是非常值得学习的。但没有看过那书的也可以继续往下看,我尽量讲清楚些:
  首先在内存中开辟一个64k的数组存编译好的指令,三个2k的整型数组用于存脚本中用道的整形变量。一个字符型二级指针来记录一个脚本中出现的所有字串,一个整形数据ip代表当前指令地址:
  short code[0xFFFF/2];
  short data[3][1024];
  char **msg;
  long ip;
  读入脚本时需要将冗长的语句化为简单的符号保存在code中方便执行列如读10号地图"MAP 10"翻译为"M 10"(第一个字节用ASCII码表示的)这样为执行时排除了语法错误和许多无聊的分析如果规定操作码占一个字节,执行指令时只要取第一个当前字节 code[ip];来判断此语句的功能,并作出相应的放应。然后象后移动ip指针就这样直到游戏结束。程序是这样的:
while (loop==LOOPING) //指令执行流程
{
  switch (code[ip]) //分析指令
  {
   case 'M': err=GAME.load_map(code[ip+1]); code_len=2; break; // 读某号地图指令
   case 'J': ip=code[ip+1]; code_len=0; break; // GOTO指令
   case 'C': err=ACTOR.createactor(code[ip+1],code[ip+2],code[ip+3]); code_len=4; break;
         // 创建演员(NPC)主角和NPC同属于演员,只是控制方式不同而已
   ....
   case 'R': code_len=1; loop=1; break; // 调用主循环的CALLBACK指令
   default: strcpy(err_msg,"unknow command at ip=%d",ip); loop=-1; err=ERROR_COMMAND;
        break; // 错误处理
  }
  ip+=code_len; // 移动指针
  if (err!=EVERYTHING_OK) loop=-1;
  ....
}
这就是运行的原理,相当于解释机器语言一般,但这才是最高效的我们称其为已编译代码下面将说明怎样把脚本解释为已编译代码,需要对脚本进行两次扫描:
  1.词法分析:记录脚本中所有申明和出现的标志,如地址,变量,字串一一记录并且把所有语句/符号换为号码,如"IF"指令用号码23代替左右括号分别用43,44代替那么"if (d[2][0]==10&&d[3][1]==1) goto JMP1"则表示成"23 43 #'d 2 0' 46 #'d 3 1' 47 #'1' 44 18 #JMP1"
处理错误。
  2.语法和词法分析:第二便扫描,根据上面的号码进行上下文分析,开始编译,生成已编译代码。当碰到标志时则编译为查找表中的索引地址,把一条指令换为若干已便宜代码,并处理错误。这样代码和数据实现了分离符合高级语言编译法则。
  编程思路:(未完,待续 )

   
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-25 03:41 , Processed in 0.012339 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表