网页功能: 加入收藏 设为首页 网站搜索  
RPG脚本之道
发表日期:2006-08-30作者:[转贴] 出处:  

  脚本者,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.语法和词法分析:第二便扫描,根据上面的号码进行上下文分析,开始编译,生成已编译代码。当碰到标志时则编译为查找表中的索引地址,把一条指令换为若干已便宜代码,并处理错误。这样代码和数据实现了分离符合高级语言编译法则。
  编程思路:(未完,待续 )

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 RPG脚本之道
本类热点文章
  C++ 常用模板武道会
  深入运算符new 返回值
  实现一个脚本引擎
  C/C++ 应用漫谈一
  剖析C++模板(下)
  C++源代码游戏编程--WinMain()函数集
  怎样在游戏中实现脚本控制
  角色扮演游戏引擎的设计原理
  RPG脚本之道
  C++ STL简介
  STL 简介,标准模板库
  Generic: 再谈Min和Max
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00401