首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.2.2  载入和执行脚本

每个游戏脚本在生存期跨越了好几个阶段,所有这些在图3.3中都以图例的形式进行了解释。首先,游戏脚本被载入。在这个简单的游戏语言中,垂直方向的空白和注释是不允许的,这就意味着需要将源文件中的每行代码载入到字符串数组里面的每个单独的元素。一旦这个过程完成了,这个数组就包含了该脚本in-memory的一个备份并准备执行。参看图3.4以获得对于游戏脚本in-memory格式的一个更加形象的理解。

图3.3  游戏脚本的生存期

注:脚本由一个字符串数组中载入,并通过脚本控制器(script handler)加以执行,最后实施对于游戏引擎的控制。

图3.4  内存中的游戏脚本

一旦被存放到内存当中,游戏脚本就可以通过让每行代码都通过脚本处理程序(script handler,或者是executor,以及其他的各种名称)来使其获得执行。脚本处理程序负责处理每条命令,读入指令参数等。一旦一条游戏命令和它的参数被处理和识别了,脚本处理程序就会完成与该条游戏命令相关联的具体任务。例如,对于指令MoveNPC而言,脚本处理程序用两个整型变量(X和Y)在游戏引擎内部直接修改非玩家角色的数据。从这一点上说,游戏脚本成功地控制了游戏引擎。

基于命令的脚本语言始终都是顺序执行的。这就意味着执行过程是从一条命令开始(第0行)直到最后一条命令结束(在图3.4所示的例子中是第5行)。在这个过程的每一步当中,表示脚本中当前行代码的一个全局变量都会被更新以反映将要处理的下一条命令。这个全局变量可能会被称为g_iCurrLine,它的表示意义是current line。当这个过程以循环的方式进行重复时,这个脚本将会连续地快速执行以用于模拟实际代码的执行过程。一旦到达了脚本的最后一条命令,脚本就会停止运行或者返回到开始的地方并重新运行。图3.5解释了一个脚本的执行过程。

图3.5  一个脚本的执行过程

脚本循环

当到达了最后一条命令的时候,你的脚本到底是应该停止还是应该继续循环呢?对于这个问题,没有一个固定的答案,因为回答这个问题要取决于当时脚本的具体情况。例如,我们继续前面有关角色扮演游戏引擎的话题,一个定义武器或者物品行为的脚本就应当执行一次并在脚本末尾迅速终止。当游戏玩家使用物品时,游戏脚本就需要执行一次以允许物品完成任务或者执行相应的动作,然后立即结束。除非是游戏玩家具体要求它这么做,或者是该物品具有某种持久的特性(例如一个应该一直燃烧着的火炬),否则该物品不应多次执行。

提示:游戏脚本的循环以及这些脚本的行为看起来具有可预测性的问题具有很多种解决办法。第一种解决办法就是,增加游戏脚本的长度以使得它在进行循环之前可以产生足够数量的独特行为,这样游戏玩家就没有时间(或者是兴趣)注意到它是按照一定的固定模式执行的。此外,我们还可以编写很多小型的脚本,它们以一种具有细微差别的方式实现相同的行为。这些脚本然后由游戏引擎随即的载入进来以产生一些真正的(或者是几乎真正的)随机行为。

应当循环执行的脚本主要就是那些负责控制与背景相关的实体或者其他环境实体的游戏脚本。例如,非玩家人物代表着游戏世界中活着的居住者,这就意味着他们应当连续不断地四处行走以使游戏玩家觉得他们一直都没有见过面。因而,当非游戏角色脚本执行完最后一条命令时应该立即返回到第一条命令,这样的话它们的行为从来不会停止。毫无疑问,这也就意味着循环的游戏脚本迟早都会被识别出来,这或许不是一件什么好事情。可是,我并没有说除了这些缺点以外基于命令的脚本就不会是一件好事情。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论