制作手札---RPG是怎样做成的 (二) |
发表日期:2007-01-17作者:[转贴] 出处: |
三月二十七日 星期六:系统分析
“系统分析”如此专业的词汇可能会立刻吓退一大片人,我当初也是如此!不过只要你认真读完下面的文字,也许你会说一声:‘系统分析’也不过如此嘛! 顾名思义‘系统分析’就是对整个游戏系统的规划,自顶向下的将它细化成一个个可由程序实现的模块;然后再把各个模块细化成一条条的语句。如此一来,写程序时就可以有条不紊,不会再像以前那样想到哪儿写到哪儿了。 相信大家对RPG都是非常熟悉的,通常的RPG按功能可分为:消息处理系统、场景显示及行走系统、打斗系统、升级系统、对话系统和事件处理系统六大部分。其中又以消息处理系统走为核心模块,其余五部分紧紧围绕它运行。我的系统分析报告如下:
在这里并没有把每个模块的具体实现方法写出来,因为我认为把大量细节上的东西一股脑的堆在面前,实在是太枯燥了。为了不让你失去耐性,我决定还是把这些东西留到具体实现的时候来讲,也许这样会较生动而利于理解一些。 利用今天剩下的时间,我建立了两个非常重要的数据结构:‘角色’和‘地图‘的属性类结构。 //*********角色属性结构********** typedef struct{ char Name[32]; //角色名称 int Width,Hight; //角色大小 int x,y; //当前坐标 int old_x,old_y; //旧的坐标 int Way; //方向 int Stats; //状态 int Level; //等级 int Exp; //经验 int Lift; //生命 int MaxLift; //生命最大值 int Attack; //攻击 int Defend; //防御 int Speed; //速度 char Goods[10]; //物品(最多可带10件) }Role_Struct;
//*********地图结构********** typedef struct{ char Name[32]; //名字 int Width; //宽 int Hight; //高 char Ground; //地面材料 char res[7]; //保留 unsigned short *Data; //数据 }Map_Struct;
将同一事物的属性归在一起,使程序清晰易读,有利于我们方便的管理数据、把握大局;更是顺应了当今面向对象的程序设计思路。
三月二十八日 星期天:消息处理系统 今天的任务非常明确,就是搭起游戏的筐架(即建立游戏的消息处理系统)。 我们的这个消息处理系统和Windows的消息处理机制其实非常相似,都是先等待消息,然后根据收到的消息转到相应的函数进行处理。所不同的是Windows 接收的消息大多是系统或是用户输入产生的,而我们的消息都是自定义的,如:小飞刀在森林中行走时碰到了强盗,那么我们就让程序产生‘打斗消息’(即:Message=打斗),消息处理系统收到这个消息后就会马上转到打斗模块中去。 不要把消息处理想的太复杂,打个简单的比方:假如你是一位接线员,在你前面的桌上有很多部电话,那么你要做的是:有电话响时就接电话,没有电话响时就什么都不做。是不是很简单!其实消息处理也就是这个道理。 消息处理的大体框架如下:
//首先定义一些消息: #define 行走 1 //行走消息定义为1 #define 打斗 2 //打斗消息定义为2 #define 对话 3 //对话消息定义为3 #define 升级 4 //升级消息定义为4 #define 事件 5 //事件消息定义为5 #define 结束 6 //结束消息定义为6 …… //定义程序中要用到的变量 DWORD Message; //消息变量 Role_Struct Hero; //定义小飞刀的属性结构 Map_Struct Map; //定义地图的属性结构 …… WinMain() //进入程序 { 初始化主窗口; 初始化DirectDraw环境,并调入程序需要的图形、地图数据; while( 1 ) //消息循环 { switch( Message ) { case 行走: 行走模块(); case 打斗: 打斗模块(); case 对话: 对话模块(); case 事件: 事件模块(); case 退出: 退出游戏(); } } } OK!我们的程序框架已经出来了,这时你心中也一定有了一个相当清晰的轮廓吧!好了,到目前为止该游戏的整体规划也就可以告一段落了,今后几天的工作重心将转到具体模块的实现方法了。可要加油哦^_^ |