3.2游戏项目中的Lua

把脚本语言集成到游戏项目中可以提升团队的开发效率,并且可以很好地扩展原生编译语言的能力。Lua在游戏开发的许多基础领域中都表现得很出色。
在游戏开发团队中,可能有许多成员都使用Lua来完成他们的工作。程序员负责将Lua整合到游戏开发环境中,通常,他们会需要编写一些Lua代码。游戏设计师是脚本语言的主要使用者,因为他们和上层的游戏设计和数据直接打交道。美术师也会经常使用Lua,进行诸如界面布局、设计和3D场景中各种模型的摆放之类的工作。
Lua是非常强大的工具,可以用来完成下面这些工作:
■ 编辑游戏的用户界面
■ 定义、存储和管理基础游戏数据
■ 管理实时游戏事件
■ 创建和维护开发者友好的游戏存储和载入系统
■ 编写游戏的人工智能系统
■ 创建功能原型,可以之后用高性能语言移植

3.2.1游戏界面

游戏界面是玩家和你的游戏进行交互的媒介。游戏界面是一个游戏最基本的部分,因为它负责所有和玩家的交互工作。因为它的重要性,所以需要能够高品质、高性能地运行,并且能够被测试和持续改善,以最大化地提升用户体验。
Lua可以让界面设计师迅速创建所有主要的界面元素——进行界面布局、管理用户输入并且输出游戏数据。利用游戏程序员开发的一部分核心的界面控件和控制函数,界面设计师不仅能负责界面的美术观感还能控制游戏的交互。这不仅节省了程序员的时间,而且给了美术设计师更大的创作空间,同时还能为界面设计的测试节省出许多时间。代码清单32展示了使用Lua创建文本GUI控件的方法。

3.2.2管理游戏数据

管理游戏数据对于游戏开发者一直都是一种挑战。游戏数据定义了游戏世界中所有对象的参数和特性,如脉冲枪升级费用、气垫船的行驶速度等。对于数据密集型游戏来说,开发者常常利用电子表格工具来输入和保存数据,然后创建解析工具将其转换成游戏中可以使用的格式。这种方法一般用在数据密集型游戏中,如角色扮演类游戏(NPC或者非游戏玩家角色的信息以表格结构形式存储)或者策略类游戏(角色单位信息保存在数据表中)。
Lua可以让这个存储系统更为简单,它以Lua文件作为存储介质让程序使用相同的数据。通过创建一个简单的数据管理系统,变量和类型可以定义在Lua中,然后可以很容易地读取。因为不用关心整个数据处理过程,所以游戏设计师可以按照需要修改、增加和缩减游戏数据,而不需要程序员的协助。因为Lua语法的特性和在脚本中添加注释的能力,数据文件是易读的。如果需要转换工具,也非常容易开发,把Lua数据输出到Lua文件,然后在运行时载入。
Lua本身并没有可以直接访问外部数据库的能力,但可以用C++开发访问数据库的组件,然后再利用LuaGlue函数整合该组件来达到目的。
在代码清单33中,我们可以看到如何使用Lua示例文件来直接保存游戏数据。在这个例子中,通过使用LuaGlue函数,向由核心代码管理的数据结构中写入数据。代码清单3-3的输出可参照图3-1。

3.2.3事件处理

通常,游戏中的绝大部分重要的处理都是由事件驱动的,要么是来自游戏角色,要么是来自游戏中那些交互的代理。这些事件可以是简单的,如用户按下了键,也可以是复杂的,如两个游戏实体同时来到了某个地方。
事件驱动的编程,对于熟悉了Windows开发(事件是Windows GUI操作的基础)的用户来说不是什么陌生的技术。在C++精心开发的事件系统中,使用Lua来接收和处理这些事件,用户可以在游戏内部运行机制、高级Lua函数和用户输入之间创建清晰的反馈流程。一个简单的例子是,获取键盘输入然后向Lua事件处理器发送该事件,同时将该输入值显示出来。这个概念将一直贯穿于本书之中——事件会返回事件类型ID和驱动事件的物体ID,参照代码清单3-4。

3.2.4保存和读取游戏状态

保存和读取玩家的数据是游戏开发项目中最具有挑战的事情之一。因为玩家有时需要暂时离开游戏,所以需要一种保存游戏进度的方法。玩家还需要在某种新的尝试和挑战前保存游戏状态,这样万一尝试失败了还可以恢复游戏进度。同样,在开发和测试过程中,开发者会经常需要读取特定的游戏状态来验证游戏功能或者确认bug是否已修复。
如果使用Lua保存用户的核心游戏数据,那么就可以用Lua作为保存和读取当前游戏状态的系统。在Lua中,游戏进度文件是简单的可执行的Lua代码的文本文件。程序员或者设计师可以通过进度文件来获取当前游戏的状态(也可以修改),读取游戏进度就和执行Lua脚本一样简单。利用Lua标准的输入/输出函数,编写一个函数来保存游戏数据到可执行的Lua脚本中是最直接的方法。这个系统的优点是可以让设计师在开发过程中,根据游戏数据的增长和删减来编辑并修改这个函数(不需要特别的读取函数)。在开发的最后阶段,还可以利用脚本编译函数来为游戏数据加密。

3.2.5人工智能

人工智能(AI)在如今的游戏中非常关键——玩家需要精明的、有挑战性的对手,感觉就像真人一样。游戏开发者明白真实世界的AI不是说完全模仿人如何玩和反应,而是为玩家创造这种感觉。多年来,开发者一直在争论计算机对手“作弊”(计算机对手可以比玩家访问更多的游戏数据)的优缺点。这种争论最好用在别的时间和地方。不过,几乎所有的开发者都同意,比起AI模拟,AI行为的玩家感知更为重要。
就开发AI判定来说,Lua是一种非常高效的工具。有许多人工智能组件,如路径寻找,最好留给底层语言来实现。路径寻找(计算机控制的物体在虚拟世界中的路径寻找)是一个数据运算量很大的工作,计算机需要反复测试可能的路径来寻找最短或者最直接的路径。(路径寻找最好整合到上层的LuaGlue函数中以便控制相关参数,但还是会在后面的章节中介绍一种Lua的实现。)另一个例子是用最大最小值方法实现的移动判定,一般被用在计算机象棋游戏中,预测之后几步的移动并尝试计算出最优的移动步骤。一般来说,“能思考的函数”都需要大量的数学计算,如导航树或者尝试错误法运算最好都留给底层代码。依赖有限的数据集合和参数的人工智能才更适合Lua的特点。Lua的优点是设计师可以编写简单的模型来试错,并快速验证和迭代想法而不需要麻烦程序员。想要利用Lua高效率实现AI,需要很仔细地设计函数(C函数),让Lua脚本可以访问和交互游戏数据。使用Lua作为事件管理系统同样可以让AI设计师能应对游戏开发中的变更,开发出灵活反应的AI系统。
在代码清单35中,用户可以看到使用Lua来评估可能的竞选旅行目的地,评估的依据是这个州的选举人票数量和这个州的支持率。

3.2.6快速构建原型

商业化的游戏必须为玩家提供高性能的体验,掉帧和处理延迟的现象在如今竞争激烈的市场中是绝不允许的。程序概要分析(Profiling)是行之有效的确定性能瓶颈的方法,但必须在所有功能都开发完成并正确工作的前提下才能进行。原型开发和性能改善一般是不能同时进行的。
Lua是构建可移植的核心游戏功能原型的不错工具。因为Lua可以整合原生语言开发的组件,所以移植单独的Lua函数到C++,对于其他Lua函数来说是不需要变更的。它可以让设计师在构建原型时,如果碰到有高性能需求的函数就可以让程序员用底层语言来实现。因为程序的算法结构已经有了,所以C函数和LuaGlue调用都可以高性能、无缝地集成在项目中。

《Lua游戏开发实践指南》一3.2游戏项目中的Lua相关推荐

  1. lua游戏开发实践指南光盘_Godot游戏开发实践之三:容易被忽视的Resource

    一.前言 首先,特大喜讯,奔走相告, Godot 爱好者们又有新的窝了--我们国人自建的 Godot 论坛:Godot中文社区已经正式开放,这里有一手的开发资源,最新的科技动向,开发上有啥问题可以随时 ...

  2. lua游戏开发实践指南光盘_Godot游戏开发实践之一:用High Level Multiplayer API制作多人游戏(上)

    一.前言 距离上一次发文已经稳稳超过一年了,去年一直在做 #¥@#*!%--%#&-%&^# 然后待在家里了!偶尔写写 BUG ,一直默默关注着 Godot ,这不已经 3.2.2 版 ...

  3. 《LUA游戏开发实践指南》学习笔记1

    本文只做个人学习笔记! Lua脚本语言的优点:免费.小巧.快速和易移植. 游戏项目中的Lua,可以完成以下工作 编辑游戏用户界面(玩家和你的游戏进行交互的媒介) 定义.存储和管理游戏数据(Lua本人并 ...

  4. 《Lua游戏开发实践指南》学习笔记3

    深入学习Lua table数据结构 在这里,小编给各位说个小伤感的笑话,我的一个好×××啊去一家公司面试,该企业面试的全是有关lua的题,其中有一道题是这样的,问"Lua中有数组吗?&quo ...

  5. Android游戏开发实践指南(华章程序员书库)

    <Android游戏开发实践指南(华章程序员书库)> 基本信息 原书名:Learning Android Game Programming:A Hands-On Guide to Buil ...

  6. AndEngine 《Android游戏开发实践指南》之“吸血鬼游戏”实例学习(一)

    购买的<Android游戏开发实践指南>一书用的AndEngine库已经更新过,书上很多代码不适应于AndEngine GLES 2. 根据书上的步骤通过学习<少女大战吸血鬼> ...

  7. iPhone游戏开发实践指南

    <iPhone游戏开发实践指南>前言 编写游戏不是一项轻松的任务,即使你是个经验丰富的程序员,游戏的设计模式.术语和思考过程看上去也会有点奇怪和不合常规.由于我的大部分工作时间都投入到了创 ...

  8. eBPF 入门开发实践指南三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用

    eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具.它允许开发者在内核运行时动态加载.更新和运行用户定义的代码. 本文是 ...

  9. Activity-的-36-大难点,你会几个?,android游戏开发实践指南

    1.8 Activity 的四种状态 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFcrVAzd-1636340687545)(//upload-images.ji ...

最新文章

  1. linux下新文件权限设置之umask的理解
  2. 深度学习-Tensorflow2.2-图像处理{10}-图像语义分割-23
  3. SAP Spartacus里如何查找所有可以focus的HTML元素
  4. Clojure Project 工程文件分析
  5. mysql单表操作_mysql单表操作
  6. (转)SpringMVC学习(七)——Controller类的方法返回值
  7. lubridate | 日期类型数据的转换
  8. python写sql语句_python3将变量写入SQL语句的实现方式
  9. SQLPro Studio for Mac(数据库管理器)2022.14
  10. ElasticSearch IK分词器配置远程词典
  11. Hive select 语句大量技巧
  12. 网站QQ客服直接临时会话
  13. thinkphp 批量打包下载图片到本地电脑
  14. php zend optimizer 解密,zend guard对php代码加密 zend optimizer解析
  15. 京东大数据方向-Java方向-实习面经一面二面(offer没去。。。)
  16. 每日作业20200429 - 二元一次方程 解鸡兔同笼
  17. Android WebView(一) WebView详解
  18. 忆阻蔡氏电路matlab,基于有源带通滤波器的忆阻蔡氏电路研究.doc
  19. 高等数学、线性代数、概率论、几何这些知识可以用来干什么?
  20. webim 实现实时通讯的 4 种方式

热门文章

  1. 车牌识别算法_易泊车牌识别算法助力智慧城市交通
  2. collins词典第八版mdx_英语词典选择
  3. python 怎么算l2范数_python之彻底搞懂迭代、可迭代、迭代器的区别(一)
  4. pycharm 中文_环境搭建:3.pycharm社区版安装配置
  5. Java中List.forEach()方法使用
  6. 使用BigDecimal时,报NumberFormatException
  7. php解析定时任务格式,php 实现定时任务简单实现
  8. java生日验证_Java验证身份证号码是否有效
  9. python 车牌识别简单_简单30行Python代码让你玩转YOLO目标识别检测!
  10. 写出常用的5个linux命令 并解释,【PHP面试题】写出尽可能多的Linux命令。