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

1.6.2  脚本编程概述

或许你很疑惑为什么要把上面的最后一节用于介绍通用游戏编程后面的处理过程,一方面,或许很多人都已经很了解这些问题;另一方面,本书的重点应该是介绍脚本编程的。好的,我们不要再为这个争辩了,因为这就是你将来学以致用的地方。我只是希望确保这些编程过程在你的脑海中是全新的,因为后面的这一节与之非常相似。在事物之间建立一些联系通常是一种很好的方法。就像我前面提到的那样,编写程序和编写脚本有很多地方是相似的,这两种行为几乎基于同样的概念。当编写脚本的时候,你仿佛就像在编写一段普通的程序。你打开某种文本编辑器(如果你能构造一个真正类似Visual Studio的IDE的话,你或许也可以就使用它来编写),就像你处理C/C++编程一样以一种高级语言的形式输入代码。当你完成这一切之后,你将源文件交给编译器,编译器负责将其转换为机器码。到现在为止,所以这些都和1.6.1节讨论的编程过程几乎没有什么区别。

但是,两种编译器在翻译高级语言代码时产生了不同。你应牢记,脚本的整体概念就是它像一种运行在其他程序内部的程序。因此,脚本编译器不能像为一个Intel CPU编译那样直接将代码转化为80X86的机器码。事实上,它不能将源码转化为任何类型CPU的机器码,因为这些代码不会直接运行在CPU上。

如果不使用CPU,那么这些代码又是如何执行的呢?答案就是虚拟机(virtual machine, VM)。其实虚拟机和计算机内部的CPU非常相似,不过,它们二者之间仍有一些不同,虚拟机是软件而CPU是硬件。CPU的基本工作就是获取下一条将要执行的指令,分析指令将要完成的功能并执行该条指令。虚拟机实现的功能也与之类似。不同之处在于虚拟机只能识别它特定的那种汇编语言(经常称为字节码,稍后将会接触到)。

虚拟机的另外一个重要特性就是,至少在游戏脚本编程的内部,它通常不是孤立的。相反,它是一个特殊的“模型”,可以产生其他程序或与之集成。这一点和CPU非常相似,CPU也可以和主板、RAM、硬盘,以及一些输入/输出设备集成在一起。单纯一块CPU是没有什么用处的。将与虚拟机集成的程序称为主应用程序(host application),我们最终也就是为这个程序编写脚本。例如,如果将一个VM集成到前面讨论过的虚拟的RPG游戏中,脚本就会在这个虚拟机中运行,实际上你仍然是在为RPG编写脚本。虚拟机仅仅就是一个将脚本功能传递给主机的一个容器。

因此,一个脚本系统并不仅仅只是为自己设计一个高级的、C/C++形式的语言,它还需要创立一种低级的汇编语言,即虚拟机器码(virtual machine code)。脚本编译器将脚本转换为这种代码,并且这个结果在主应用程序的虚拟机中运行。虚拟机和主应用程序之间也可以相互通信,并且通过这个桥梁,脚本可以向主机发送具体的控制指令。图1.4可以很好地帮助你理解这个交互过程。

图1.4  交互过程

虚拟机的脚本装载器(script loader)将虚拟机器码从脚本文件中载入,并允许虚拟机执行这些代码。除了一套运行环境,虚拟机还为运行的脚本和主应用程序提供一个通信通道,即交互界面。

注意:在程序的上面还有另外的两层——虚拟机VM和虚拟机中的脚本script(s)。

现在,我们先从这些理论中走出来休息一会儿,同时思考一下这些理论怎么才能被应用到虚拟PRG游戏中。现在你已经不再是简单地通过一组数值来定义物体,然后由程序盲目地将这些物体插入到物体队列中,取而代之的是,你可以编写一段代码,在每次需要物体的时候由程序通知虚拟机VM来执行这段代码。通过虚拟机,这段代码可以向游戏发出信息,游戏也可以进行信息反馈。脚本可能会询问游戏现在这个游戏玩家有多少体力值(hit points,HP)以及他现在穿戴的是什么样的装甲。游戏会将这个信息传递给脚本并允许它对此进行处理,最后脚本将会执行与之相关联的功能。

主应用程序提供具有一组功能函数的运行脚本,这些功能函数被称为API(Application Programming Interface的缩写)。主应用程序可以通过调用这些功能函数来控制游戏。对于RPG游戏而言,这些API可以允许脚本在游戏世界中移动玩家的位置,获取物品,更换背景音乐等。如果拥有了这样一套系统的话,那么任何游戏功能应该都是可以实现的了。

这个好消息听起来是不是很令人振奋呀?但是,我同时还要告诉你一个好消息和一个坏消息。这个坏消息就是这种方法仍然不能代表一切,确实存在很多方法可以实现这样一种游戏脚本系统,而这只不过是其中的一种方法而已。好消息就是到现在为止,这种方法仍然是最复杂的。如果你能很好地理解这种方法的话,那么其他的方法也就自然会迎刃而解了。

因此,你还有什么好犹豫的呢?

查看所有评论(0)条】

最近评论



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