现在的网络游戏中一般都有很多的任务可以做,玩家经过做任务既可以感受游戏的故事、更快的溶入游戏中,同时还能获得一些比较好的奖品,真正的好玩又实用。任务是网络游戏吸引玩家的重要手段,简单的有送信、取东西等,复杂的就像是一个小的RPG,通过一定的故事情节来一步步吸引玩家做下去。
那么这些任务是怎样做出来的呢?这里想和大家探讨一下这方面的问题。通过观察和分析,发现一般网络游戏的任务是通过脚本来写的,关于脚本的具体实现等问题,这里不会深入的说明,有兴趣的朋友可以到网上搜索相关内容。我们假设已经有了一套完整的脚本系统,那么怎么在这套系统上做出游戏的任务呢?
不论简单还是复杂,任务都是由一系列的步骤组成,那么我们可以在玩家身上放两个变量,一个记录任务的ID,一个记录当前任务所在的步骤Step,这两个变量就表明了该玩家正在做什么任务、做到第几步了。 接下来是任务的定义,请看下面的类:
// 网络游戏的任务类
class CMission { // 脚本触发点类型
enum { TT_TALK = 1, //和NPC对话
TT_FIGHT = 2, //和怪物战斗之前
TT_WIN = 3, //打死怪物之后
TT_TIME = 4, //特定时间
TT_POINT = 5, //特定地点
};
// 触发点结构
struct stTouchPoint { long lTouchType; // 触发点类型
long lObjectID; // 触发对象ID(可以是NPC、怪物、地点等)
CString strScript; // 具体脚本
};
long lMissionID; // 任务编号
list<sttouchpoint> listTouchPoint; // 触发点列表
};
|
一个任务由一系列触发事件的脚本组成,比如玩家和一个NPC对话后,NPC告诉他去打死某个怪物,然后回去找他就可以得到奖品,我们只需要控制玩家先触发哪个脚本、然后再触发哪个脚本就可以推动任务进行。
首先和NPC对话,触发NPC脚本,把玩家的Step变量改为1(初始值为0),表明任务进行到了第一步,然后去打那个指定的怪物,打死后触发怪物的死亡脚本,当发现Step=1的时候,任务被推动,把Step改成2,然后再回去找那个NPC,NPC发现Step=2,就说明玩家已经打死了指定的怪物,这时给玩家奖品,最后把Step设成-1表明任务结束。 根据上面的机构,可以把任务设置成为一个个任务包,一个任务包包含了任务所牵涉的所有NPC、怪物以及它们相应的触发脚本,在服务器启动时会查找当前存在的任务包,并根据每个任务包的具体内容填写对应的触发者脚本链表。
当一个触发者被触发后,遍历它的脚本链表,和玩家身上存在的任务ID比较,如果发现有相同任务ID的任务,再和玩家身上的任务Step比较,如果相同就说明玩家的任务正好进行到这一步,运行对应的脚本推进任务即可! 至此,游戏任务的执行原理已经基本上描述出了,希望能对大家有所启发。
金点时空 soft 2002/3/25 E-mail:softboy@sina.com http://www.gpgame.com
|