现实中的游戏开发常常面临两种互相矛盾的压力,一方面需要测试和验证新想法,另一方面又需要快速开发并且按时交付。把脚本语言集成到游戏项目中可以提升团队的开发效率,并且可以很好地扩展原生编译语言的能力。Lua在游戏开发的许多基础领域中都表现得很出色。
在游戏开发团队中,可能有许多成员都使用Lua来完成他们的工作。程序员负责将Lua整合到游戏开发环境中,通常,他们会需要编写一些Lua代码。游戏设计师是脚本语言的主要使用者,因为他们和上层的游戏设计和数据直接打交道。美术师也会经常使用Lua,进行诸如界面布局、设计和3D场景中各种模型的摆放之类的工作。
Lua是非常强大的工具,可以用来完成下面这些工作:
- 编辑游戏的用户界面
- 定义、存储和管理基础游戏数据
- 管理实时游戏事件
- 创建和维护开发者友好的游戏存储和载入系统
- 编写游戏的人工智能系统
- 创建功能原型,可以之后用高性能语言移植
1 游戏界面
游戏界面是玩家和你的游戏进行交互的媒介。游戏界面是一个游戏最基本的部分,因为它负责所有和玩家的交互工作。因为它的重要性,所以需要能够高品质、高性能地运行,并且能够被测试和持续改善,以最大化地提升用户体验。
Lua可以让界面设计师迅速创建所有主要的界面元素——进行界面布局、管理用户输入并且输出游戏数据。利用游戏程序员开发的一部分核心的界面控件和控制函数,界面设计师不仅能负责界面的美术观感还能控制游戏的交互。这不仅节省了程序员的时间,而且给了美术设计师更大的创作空间,同时还能为界面设计的测试节省出许多时间。代码清单3.2展示了使用Lua创建文本GUI控件的方法。
代码清单3.2 使用Lua创建文本GUI控件
2 管理游戏数据
管理游戏数据对于游戏开发者一直都是一种挑战。游戏数据定义了游戏世界中所有对象的参数和特性,如脉冲枪升级费用、气垫船的行驶速度等。对于数据密集型游戏来说,开发者常常利用电子表格工具来输入和保存数据,然后创建解析工具将其转换成游戏中可以使用的格式。这种方法一般用在数据密集型游戏中,如角色扮演类游戏(NPC或者非游戏玩家角色的信息以表格结构形式存储)或者策略类游戏(角色单位信息保存在数据表中)。
Lua可以让这个存储系统更为简单,它以Lua文件作为存储介质让程序使用相同的数据。通过创建一个简单的数据管理系统,变量和类型可以定义在Lua中,然后可以很容易地读取。因为不用关心整个数据处理过程,所以游戏设计师可以按照需要修改、增加和缩减游戏数据,而不需要程序员的协助。因为Lua语法的特性和在脚本中添加注释的能力,数据文件是易读的。如果需要转换工具,也非常容易开发,把Lua数据输出到Lua文件,然后在运行时载入。
Lua本身并没有可以直接访问外部数据库的能力,但可以用C++开发访问数据库的组件,然后再利用LuaGlue函数整合该组件来达到目的。
在代码清单3.3中,我们可以看到如何使用Lua示例文件来直接保存游戏数据。在这个例子中,通过使用LuaGlue函数,向由核心代码管理的数据结构中写入数据。代码清单3.3的输出可参照图3.1。
代码清单3.3 使用Lua保存美国总统选举模拟游戏(《Frontrunner》)的数据
图3.1 游戏《Frontrunner》的截图,Lua数据的实时显示
3 事件处理
通常,游戏中的绝大部分重要的处理都是由事件驱动的,要么是来自游戏角色,要么是来自游戏中那些交互的代理。这些事件可以是简单的,如用户按下了<W>键,也可以是复杂的,如两个游戏实体同时来到了某个地方。
事件驱动的编程,对于熟悉了Windows开发(事件是Windows GUI操作的基础)的用户来说不是什么陌生的技术。在C++精心开发的事件系统中,使用Lua来接收和处理这些事件,用户可以在游戏内部运行机制、高级Lua函数和用户输入之间创建清晰的反馈流程。一个简单的例子是,获取键盘输入然后向Lua事件处理器发送该事件,同时将该输入值显示出来。这个概念将一直贯穿于本书之中——事件会返回事件类型ID和驱动事件的物体ID,参照代码清单3.4。
代码清单3.4 获取按键事件的例子
4 保存和读取游戏状态
保存和读取玩家的数据是游戏开发项目中最具有挑战的事情之一。因为玩家有时需要暂时离开游戏,所以需要一种保存游戏进度的方法。玩家还需要在某种新的尝试和挑战前保存游戏状态,这样万一尝试失败了还可以恢复游戏进度。同样,在开发和测试过程中,开发者会经常需要读取特定的游戏状态来验证游戏功能或者确认bug是否已修复。
如果使用Lua保存用户的核心游戏数据,就可以用Lua作为保存和读取当前游戏状态的系统。在Lua中,游戏进度文件是简单的可执行的Lua代码的文本文件。程序员或者设计师可以通过进度文件来获取当前游戏的状态(也可以修改),读取游戏进度就和执行Lua脚本一样简单。利用Lua标准的输入/输出函数,编写一个函数来保存游戏数据到可执行的Lua脚本中是最直接的方法。这个系统的优点是可以让设计师在开发过程中,根据游戏数据的增长和删减来编辑并修改这个函数(不需要特别的读取函数)。在开发的最后阶段,还可以利用脚本编译函数来为游戏数据加密。
5 人工智能
人工智能(AI)在如今的游戏中非常关键——玩家需要精明的、有挑战性的对手,感觉就像真人一样。游戏开发者明白真实世界的AI不是说完全模仿人如何玩和反应,而是为玩家创造这种感觉。多年来,开发者一直在争论计算机对手“”(计算机对手可以比玩家访问更多的游戏数据)的优缺点。这种争论最好用在别的时间和地方。不过,几乎所有的开发者都同意,比起AI模拟,AI行为的玩家感知更为重要。
就开发AI判定来说,Lua是一种非常高效的工具。有许多人工智能组件,如路径寻找,最好留给底层语言来实现。路径寻找(计算机控制的物体在虚拟世界中的路径寻找)是一个数据运算量很大的工作,计算机需要反复测试可能的路径来寻找最短或者最直接的路径。(路径寻找最好整合到上层的LuaGlue函数中以便控制相关参数,但还是会在后面的章节中介绍一种Lua的实现。)另一个例子是用最大最小值方法实现的移动判定,一般被用在计算机象棋游戏中,预测之后几步的移动并尝试计算出最优的移动步骤。一般来说,“能思考的函数”都需要大量的数学计算,如导航树或者尝试错误法运算最好都留给底层代码。依赖有限的数据集合和参数的人工智能才更适合Lua的特点。Lua的优点是设计师可以编写简单的模型来试错,并快速验证和迭代想法而不需要麻烦程序员。想要利用Lua高效率实现AI,需要很仔细地设计函数(C函数),让Lua脚本可以访问和交互游戏数据。使用Lua作为事件管理系统同样可以让AI设计师能应对游戏开发中的变更,开发出灵活反应的AI系统。
在代码清单3.5中,用户可以看到使用Lua来评估可能的竞选旅行目的地,评估的依据是这个州的选举人票数量和这个州的支持率。
代码清单3.5 评估虚拟的美国总统候选人应该去哪个州的Lua人工智能函数
6 快速构建原型
商业化的游戏必须为玩家提供高性能的体验,掉帧和处理延迟的现象在如今竞争激烈的市场中是绝不允许的。程序概要分析(Profiling)是行之有效的确定性能瓶颈的方法,但必须在所有功能都开发完成并正确工作的前提下才能进行。原型开发和性能改善一般是不能同时进行的。
Lua是构建可移植的核心游戏功能原型的不错工具。因为Lua可以整合原生语言开发的组件,所以移植单独的Lua函数到C++,对于其他Lua函数来说是不需要变更的。它可以让设计师在构建原型时,如果碰到有高性能需求的函数就可以让程序员用底层语言来实现。因为程序的算法结构已经有了,所以C函数和LuaGlue调用都可以高性能、无缝地集成在项目中。
7 小结
在游戏开发领域,Lua和C++是一个功能十分强大的组合。对于GUI开发、事件管理、数据保存和获取、游戏进度保存和载入以及人工智能这些游戏开发工作,需要能够快速地构建原型、测试和迭代设计,而这些正是Lua所擅长的。在核心底层语言开发的项目中,频繁的变更会导致系统的不稳定,并让开发者不能专注于更重要的开发任务。使用Lua环境分担这些工作,可以让设计师和程序员快速而安全地使用脚本来设计、测试和实现游戏功能。
-----------------------------------------------
本文节选自《Lua游戏开发实践指南》,原书名:Game Development with Lua,作者:Paul Schuytema & Mark Manyen,译者:田剑。
本书是资深lua游戏开发工程师10余年工作经验和智慧的结晶,lua语言创始人亲自作序推荐,是lua游戏开发领域最具实战意义和代表性的著作之一。它不仅详细讲解了在游戏开发中使用lua的各种技术细节、方法技巧和最佳实践,而且讲解了如何使用lua作为主要工具将游戏设计转化为代码实现的过程。此外,它还重点阐述了lua语言的核心要素。最重要的是,本书包含大量精心设计的案例,并附赠了完整的源代码,可操作性极强。
豆瓣收藏:http://book.douban.com/subject/20392269/
PDF样章下载:http://vdisk.weibo.com/s/ix8ok
分享到:
相关推荐
lua游戏开发 第一章 游戏开发入门 第二章 脚本开发 第三章 游戏开发世界的lua语言 。。。
游戏开发类程序设计书。Lua是一种脚本语言,用于魔兽世界插件开发。官方的唯一版本5.1规格已经实施,符合大多数插件开发制作者的需要,更多关于Lua的信息请参阅官方Lua Wiki
Lua是一种脚本编程语言,于1994年,由巴西里约热内卢天主教大学的研究人员...与一般脚本语言如 PHP、Perl、JavaScript 等不同,Lua被称为是一种嵌入式 脚本语言,Lua最著名的应用是在暴雪公司的网络游戏 魔兽世界 中。
Love2d 拥有强大和活跃的社区来使其成为一个有效的游戏开发框架。Love2d 成就了世界上许多不同年龄段的独立游戏开发者,让他们有机会接触到商业视频游戏的机会。 Love2d的简单和“write less build more”的特点...
7.5.3 游戏中的两个世界 202 7.6 Box2D的基础知识 203 7.6.1 概述 204 7.6.2 概念定义 204 7.6.3 物理引擎的模块 205 7.7 引 擎 内 核 205 7.7.1 基本配置 206 7.7.2 内存管理机制 207 7.7.3 工厂模式 208 7.7.4 ...
尝试Lua语言 Lua是一种轻量级的动态编程语言,对协程(coroutine)有着很好的支持,因为有着简单的C API,使得它在游戏视频脚本处理方面非常流行。比如游戏引擎LÖVE 和Marmalade Quick。 尝试Clojure语言 Clojure是大...
我不算是一个果粉,但是我很喜欢苹果的产品,... Swift抛弃了Objective-C那种古板难懂的语法,采用通俗易懂的脚本语言类语法,学过Python、JavaScript或者Lua语言的读者肯定不会陌生,这大大降低的初学者的学习成本。
最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...
前言在日常的工作中,我偶尔能遇到这样的问题:“为何游戏脚本在现在的游戏开发中变得不可或缺?”。那么这周我就写篇文章从游戏脚本聊起,分析一下游戏脚本因何出现,而Mono又能提供怎样的脚本基础。最后会通过模拟...
本书内容全面,不仅详细讲解了android框架、android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、android游戏引擎设计、android...
全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技术,从非常专业的汇编优化到非常实际的项目管理进行了一次游戏开发的全景探索。 本书不仅适合游戏开发者阅读,也会给所有的开发者和...
该游戏本身支持语言Lua,该语言在《魔兽世界》,《愤怒的小鸟》和Roblox等中使用。通过这种脚本语言,我们将补充风险游戏的设置和系统。 “风险”是一种战争战略棋盘游戏,可以由2到7个玩家玩。 游戏的基本版本包括...
全书按照作者本人学习和实践的过程,带着读者从基础的计算机知识到高级的编程技术,从非常专业的汇编优化到非常实际的项目管理进行了一次游戏开发的全景探索。 本书不仅适合游戏开发者阅读,也会给所有的开发者和...
这使得它更容易安装,安装,皮棉和测试项目所需的Python和Lua语言的依赖。 有关更多信息,请参。 install.py脚本可用于将此存储库的克隆安装到Interface/AddOns目录中。 它将为每个插件创建指向源树中目录和文件的...
Genius-xGenius-x是一个基于以属性为中心的游戏对象模型构建的游戏框架,它基于Cocos2d-x,目前支持使用C++/Lua两种语言进行开发,Genius-x最大的目标是要实现数据驱动,使程序中关于关卡设计的部分可以最大限度地从...
这是一个由世界各地的开发人员玩的在线编程游戏! 建立一个蛇形“机器人”,并成为在游戏板上赢得胜利的最后一个。 您可以使用实现Web服务器的任何语言或技术。 有关如何编写蛇以及游戏规则的更多信息,请查看。 ...