分享

RPG核心系统浅谈 ? Reco Works

 星陨阁2.0 2011-08-18

RPG核心系统浅谈

非原创,感谢原作者的分享。

一个RPG/ARPG的核心程序应该包含下列系统

一、属性系统
这是游戏中最简单的系统,包括主角、物品、NPC、技能等各自的属性。属性系统的详细部分游戏策划应该给出,程序只需要给其保存 的结构就行了。这里的属性,自然不只包括事物的基本性状,也包括它应该引发的脚本代号。

二、人物状态机系统
这个系统十分复杂,也是所有系统得以运行的基础。这个系统标志着人物目前处于一个什么样的情况中。
相对于动作而言,人物是站立中?还是跑动中?还是对人对 持中?还是在施放魔法中?还是在施展技能中?当然,有些状态是可以同时拥有的,比如说站立和施法,有些是不能同时拥有的,比如说站立和走动,这在程序中需 要用不同的变量来区分。
相对于剧情而言,人物现在是接受了这个任务吗?没有接受任务吗?或是完成了吗?如果任务不止一步,人物进行到哪一步 了?每个任务都要用不同的状态机来保存。

相对于属性而言,人物现在是中毒吗?没有中毒吗?人物现在可以移动吗?可以以正常速度移动吗?人物现 在可以施展技能吗?可以施展哪些技能?
主角目前身上有什么物品(任务,或是非任务物品),身上有什么装备,曾经去过哪些地方,杀死过哪些怪 物,和哪些人对过话,这些东西都是需要状态机来表示的,因为脚本系统需要这些状态机来进行判断。当然,这其中有些状态机不需要事先设定,而是等需要的时候 才计算。比如说物品状态机,在需要的时候给定一个物品的代号,然后状态机系统就可以给出角色是否拥有这个物品,拥有多少个之类。

在这里有一点 关键性的东西,游戏程序中的状态机和游戏设计中的状态不是一一对应的,比如说,游戏设计中有“麻痹”这一状态,但是状态机中却不一定有(当然,状态机是人 设计的,你要设计一个这样的状态也是可以的),而是用“移动:否”、“动作:否”这两个状态机来表示。

当然还有许多许多的状态机情况,游戏的 规则越复杂,所需要的状态机就越多,状态机系统也越复杂。因为各个状态之间也是相互关联的。状态机系统之所以重要,是因为周围世界中所发生的一切行为都是 以人物处于何种状态而决定的。

三、行为系统
这个系统决定了游戏的表演方式,也与图形引擎和声音引擎挂钩。当人物(或是怪 物)发出一个动作之后,这个动作要怎么表示?比如说攻击,虽然在角色发动攻击的一瞬间,攻击是否命中,目标会受到多少伤害,这个已经被计算好了,但是不可 能角色的刀子一举起来,怪物就作出受伤的动作并且惨叫一声,而是角色的攻击动作到达某一个阶段(程序上来说就是哪一帧)的时候,怪物才作出受伤的动作。而且,还有许多不是在动作启动时就可以做出计算的,而是在碰撞检测之后才决定的(可以是物理,或是非物理的)。比如说弓箭、飞弹类型的魔法、攻击范围会 渐渐变化的魔法(例如火环),追尾型的飞弹之类,这些东西的进行方式都是行为系统来控制,而非脚本系统(以下会介绍)来控制。以火环为例,它从发动到结束 共有多少帧?每帧会产生什么样的变化?它影响的区域会怎么样变化?

不同的事物可以用不同的行为系统,但也可以共用同一个行为系统,比如说冰环 和火环,虽然他们的渲染和伤害计算是不同的,但是他们的行为是一样的。
又比如说死亡的动作。如果死亡就只有一种表现形式,那么关于死亡的行为 系统也不复杂,但是有多种死亡动作呢?比如说向前倒下、向后倒下、软倒(直立着跪下那种),如果是从正面受到攻击,那么向后倒下才符合情况,而用先前倒就 不真实了。或者是向后倒之后,再加上一定程度的移动,就可以造成“吹飞”(被人打出去很远)的效果。那么判断何时使用哪种动作,就是行为系统的部份。

当然,人物行为所造成的影响的计算也是这个系统的功能。分析人物目前的状态,决定使用哪一个公式来计算影响,动作是否成功(例如命中之类),人物/怪物 受到影响之后会产生什么样的动作(当然不是指怪物的决策行为的这种关于AI的部份,是指如果生命降到0就要执行死亡动作这一类)也是行为系统的部份。这虽 然是一个非常重要的部份,但因为大家对计算都了解,所以就不多说了。

四、交互/操作系统
操作系统相对而言是简单的,接受 用户的输入,并判断这个输入将要产生什么样的影响,执行何种操作,也需要决策是否能够执行操作。判断的准则需要同时分析角色和目标的状态。比如说,用户把 一个NPC设为目标时,这个目标是友好的吗?是敌对的吗?如果是友好的,则执行对话的行为,如果是敌对的,则执行攻击行为。或者,不管目标怎么样,现在主 角处于“麻痹”状态,所以不管攻击还是对话的行为都无法执行,所以用户的这一操作便被忽略,不予执行。

游戏的各种菜单也是这个系统的一部份。 包括剧情对话框、物品购买界面以及各色各样的特有对话系统(比如说《仙剑3》的炼剑系统界面,《轩辕剑3》的炼妖系统界面)都属于这一类。因为他们本质上 就是一种对话框,它提供给用户一些信息,而用户执行的操作将对角色产生影响,或是触发某个事件/脚本。比如说购买界面,在上面执行的操作就能够给用户增加 一项或多项物品(从地上捡拾物品也是一样)。炼剑系统则是改变主角的剑的性质。

交互系统的逻辑层面并不复杂,它的难点主要在于烦琐的细节,所 以这也是游戏中BUG多出的地方。(例如暗黑中著名的物品复制BUG,诸如此类,就是因为操作系统有缺陷才造成的。)

五、脚本系统
这是构成精彩世界的重要组成部份。一个好的脚本系统几乎可以操作游戏世界中的一切(什么?你说脚本不能控制用户的菜单?那如果你的游戏中要做一个给初学 者的教学演示呢?)。在以剧情为重的RPG中,脚本系统将是十分复杂的。
但是,不管脚本如何复杂,它都由三个基本的部份组成。第一,脚本执行 的先决条件。这个脚本执行需要什么样的条件呢?是领到某个任务,是杀死某个单位,或是到过某个地方?第二,脚本执行的动作。脚本执行的动作是多种多样的, 这取决于脚本系统的能做到什么样的事情。最基本最常见的展开一段剧情对话,或者是由一系列人物表演一系列动作,当然,只要游戏能做到的一切,都可以作为脚 本的动作。第三,脚本产生的影响。脚本执行之后,给人物,给这个世界造成什么影响呢?是增加人物的力量?或是直接导致角色死亡?接受到一个新任务?或者完 成一个任务?当然,也有可能触发另一个脚本。
脚本分为游戏脚本和地图脚本,游戏脚本是在任何情况下,只要触发并且条件满足就可以执行的脚本, 而地图脚本则是在指定的地图上才可以执行。通常它需要指定的单位和指定的环境,游戏中的大部份表演都是基于地图的脚本。

六、地图/环 境系统
如果脚本是游戏世界的灵魂的话,那么地图系统则是游戏的血肉。地图系统包含了地形状况、怪物、NPC、建筑等一切与世界相关的单位。它 是玩家活动的空间,一切元素的容器,也是脚本系统的容器,它决定什么地方拥有什么样的事件。地图上拥有什么样的人物、什么样的脚本,决定了地图上会发生什 么样有趣的事情。可以说,地图决定了整个游戏的面貌。
但是,地图分为地图和世界,世界包含整个游戏部份,在上面脚本系统中所说的游戏脚本也是 属于地图/环境系统的实现部份。这一个系统没有什么可说的,想必大家都十分了解。

七、AI系统
这个系统也是很关键的一个 系统。不过关于它并不需要太多的介绍,因为这也是大家都熟悉的系统。虽然这也是一个影响行为的系统,但是它的大部份功能在于怪物如何与角色战斗。复杂的行 为模式是脚本系统要实现的,这个系统只实现简单的决策:战斗还是不战斗、行进路线、用什么样的技能/魔法战斗等。

八、主控制系统

这个系统也不用多作说明了,它由一系列菜单和调用组成。游戏的存储、读取功能也是由这一个系统负责。它掌管整个游戏的进行过程。

——————————————–

关于脚本:

脚本起着驱动整个游戏进程的作用, 在单机RPG时代游戏的剧情发展和任务都是由客户端的脚本来驱动的。

目 前现有的网游绝大部分也都拥有自己的脚本系统, 或者嵌入某种通用的脚本语言如python,lua, 或者自己设计一套游戏流程/逻辑描述规则也就是自定义的剧情描述语言, 和单机RPG所不同的是网

游的脚本通常运行在服务器端。

游 戏中的脚本体系一般以事件为中心, 和宿主代码之间进行相互的交互。
1. 宿主代码会在某些事件发生或者满足一定条件下调用脚本, 这种调用是双方约定好的, 例如调用脚本的某一个函数
2. 脚本被调用后会执行剧情逻辑, 当然做具体的动作的时候还是要调用宿主代码暴露给脚本的接口。

脚本代码和宿主代码相比较, 最大的优势在于脚本更为简单易学, 有利于策划编写游戏逻辑, 而且不需要重新编译程序。
劣势是脚本通常是解释性的或者是类似于java有中间字节码的, 执行速度上远不及宿主二进制代码, 有的资料显示要慢10倍以上。

下面我们来看下剑侠情缘公测服务端1.2的脚本, 其用的是嵌入lua, 我们先找个它的简单来分析下是如何实现的:

巴陵县_长江码头船夫对话.lua

function main(sel)
  1. if (GetLevel() >= 10) then –等级达到十级
  2. Say(" 船夫:我有个外号叫做“浪里白条”,说起游水的功夫,全巴陵县我认了第二,就没人敢认第一!所以坐我的船你保管放心,你要去哪个码头呀?", 2, "坐船/WharfFun", "不坐/OnCancel");
  3. else
  4. Say("船夫:对不起,没到十级的新手不 能坐船出村。", 0)
  5. end
  6. end;
  7. function OnCancel()
  8. Say("船夫:没银子可坐不了船!",0)
  9. end;

在以上的脚本中描述了长江码头船夫和玩家之间的对话逻辑, 当玩家点击npc试图和其说话时, 服务器端就会调用该npc对应的脚本中的main函数来驱动游戏的剧情, 其中的GetLevel,Say等就是宿主

代码暴露给脚本的接 口, 如果玩家在客户端选了”不坐”, 客户端会发送”OnCancel”给服务器来促使其执行OnCancel函数。

下面看一 个稍微复杂些的任务脚本, 每行的#后为添加的注释
–两湖区 巴陵县 路人4小渔对话
–巴陵县新手任务:小渔的爹爹
–suyu

function main()
  1. UTask_world18 = GetTask(46); #从宿主代码得到保存的任务进度状态
  2. if ((GetCamp() == 0) and (UTask_world18 <= 2)) then #如果任务还未完成
  3. UTaskMain()
  4. else
  5. Default()
  6. end;
  7. end;
  8. function UTaskMain() #该函数由main函数调用
  9. if(UTask_world18 == 0) then
  10. UTask_world18_0()
  11. end;
  12. if(UTask_world18 == 1) then
  13. UTask_world18_1()
  14. end;
  15. if(UTask_world18 == 2) then
  16. UTask_world18_2()
  17. end;
  18. end;
  19. function Default() #如果此任务已完成就执行这个函数
  20. i = random(0,1)
  21. if (i == 0) then
  22. Say("小渔:我爹爹是洞庭湖的渔民,每天都要到湖上去撒网捕鱼,如果遇到了刮风下雨,有时会好几天都回不了家呢。",0)
  23. return
  24. end;
  25. if (i == 1) then
  26. Say("小渔:爹很疼我,可是他老说如果我是男孩子就好了,那样我就可以帮他捕鱼了。",0)
  27. end;
  28. end;
  29. function UTask_world18_0() #任务进度0:分配任务
  30. Say("小渔:呜呜……我爹昨天打鱼遇上大风雨,被淋病了,现在还发烧 呢。爹的病还没好,又不能打鱼,我们吃什么啊。你能帮我去求求吴神医么?吴神医是个大好人,他一定会帮我们的。",2,"帮忙 /yes","不帮/no")
  31. end;
  32. ——————————————-
  33. function UTask_world18_1() #任务进度1:已接受任务
  34. Say("小渔:吴神医的家就住在县南门边。",0)
  35. end;
  36. ——————————————-
  37. function UTask_world18_2()
  38. if(HaveItem("枇杷丸") == 1) then #玩家身上有物品:枇杷丸
  39. Say(" 小渔:啊!这就是枇杷丸?这下子爹爹的病很快就会好起来的。你真是个大好人,这双鞋是我娘做的,你一定要收下呀。",0)
  40. DelItem("枇杷 丸") #从玩家包裹中移除该物品
  41. if(GetSex() == 0) then #判断性别进行任务奖励
  42. AddItem(0, 5, 0, 1, 0, 0)
  43. else
  44. AddItem(0, 5, 2, 1, 0, 0)
  45. end
  46. SetTask(46, 3) #设置任务状态为已完成
  47. else
  48. SetTask(46, 1)
  49. Say("小渔:还没有找到枇杷丸么?爹爹的病可怎么办 呀,呜呜呜……",0)
  50. end
  51. end;
  52. function yes() #接UTask_world18_0, 回答yes接受任务后, 设置任务进度为1
  53. Say("小渔:我记得以前听大夫说 得要枇杷丸才可以治好高烧,可是我们穷人哪儿买得起啊。",0)
  54. SetTask(46, 1)
  55. end;
  56. function no()
  57. Say("小渔:我要在这里继续等好心人。", 0)
  58. end;

看到这里, 游戏脚本的基本原理和实现机制就应该不再神秘了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多