|
|

楼主 |
发表于 2005-11-15 16:42:00
|
显示全部楼层
Re: 底层脚本、高层脚本和微线程
底层脚本、高层脚本和微线程(五)
五:脚本与任务系统实现
诸如类似RPG类型的游戏,存在很多npc执行某些任务,玩家也可以从NPC哪里领取任务。考虑灵活性,这些任务经常需要动态增加或者更新,以保持游戏的新鲜感,增加游戏的可完性,或者调整状态的平衡。对于一个任务,涉及两部分内容,一部分是逻辑描述,采用脚本实现;另一部分是可能需要的一些内部参数,标识任务目前执行的状态,这些状态参数与任务的具体执行相关。对这两部分功能的支持,是创建一个游戏任务系统的基石,譬如如果增加一种新的任务比较麻烦,那么肯定影响游戏以后的运营和发展。
对于任务的脚本,有几种方式,在前面一节已经讨论过。
对于任务的内部参数,存储在脚本上下文环境中不是很合适,对于一个任务,可能分配给很多个玩家,每个玩家都需要记录不同的任务执行状态,也即内部参数。如果在脚本上下文中记录,一者容易重复,再者如果很多变量,则存储增加,执行效率受一定影响。其实一个任务类似于C++中的类的概念,该任务分配给某个玩家之后,相当于创建了该任务的一个实例。示例:
Task1{ Var1, Var2, …,Script }
玩家-Task1::Instance1{ 0,12,..,}
游戏采用了脚本,保证脚本修改的时候,不需要重新编译;但是对于完整的任务系统实现,还需要能够灵活定义任务需要的变量,这些变量也可以动态修改,不需要重新编译。在脚本中,可以灵活设置和访问这些变量。实现该方法不是很容易,需要费一些周折,特别是网游需要进行客户端和服务器端同步。
SRP平台V2.1版本已经实现了该功能,使用SRP Debug,可以动态创建一个类Task1,增加类的属性,Var1,Var2,…,每个属性的类型都可以设置(整型,浮点型,字符串等),可以设置类的命名脚本”Script”。
如果将该任务分配给一个玩家,则创建Task1类的一个实例Instance1,该实例挂接在玩家对象的下面,由SRP平台自动分配该类定义的属性的内存空间。在网游环境下,SRP平台自动实现了玩家和服务器之间的更新,当Task1类创建之后,自动同步到所有玩家。
在任务脚本中,可以对实例属性进行修改,下面是一个实例:
ServiceID = "24a9701d-aab8-478b-8831-a397711bd401"
ServiceContext = SRPObj.GetServiceContext( ServiceID )
Object = SRPObj.GetObjectByName (ServiceContext,"Instance1")
SRPObj.ChangeObject (ServiceContext,Object,"Var1",0,36) // 将任务的变量1数值,修改为36。
SRP实现的脚本系统非常灵活,为构造强大、灵活、完善的任务系统提供了坚实的基础。
|
|