热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《Lua游戏AI开发指南》一2.7创建一个沙箱Lua脚本

本节书摘来异步社区《Lua游戏AI开发指南》一书中的第2章,第2.7节,作者:【美】DavidYoung(杨)

本节书摘来异步社区《Lua游戏AI开发指南》一书中的第2章,第2.7节,作者: 【美】David Young(杨) 译者: 王磊 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.7 创建一个沙箱Lua脚本

基本的沙箱程序就位之后,我们就可以新建沙箱的创建Lua脚本了。首先在脚本文件夹中新建一个Sandbox.lua脚本。

像下面这样创建一个Lua文件:

src/my_sandbox/script/Sandbox.lua

沙箱Lua脚本必须实现4个全局函数供C++代码调用,它们分别是Sandbox_Cleanup、 Sandbox_HandleEvent、 Sandbox_Initialize和Sandbox_Update:

Sandbox.lua:function Sandbox_Cleanup(sandbox) endfunction Sandbox_HandleEvent(sandbox, event) endfunction Sandbox_Initialize(sandbox) endfunction Sandbox_Update(sandbox, deltaTimeInMillis) end

有了这些基础的回调函数,就可以修改SandboxApplication类的Lua代码来创建沙箱了。

MySandbox.cpp:void MySandbox::Initialize() { SandboxApplication::Initialize();...CreateSandbox("Sandbox.lua");}

在修改任何C++文件之后,别忘了重新编译沙箱应用程序。

2.7.1 创建地板

现在沙箱已经初始化好并且连接到了Lua脚本,可以开始添加一些基本的几何体和光照了。沙箱暴露给Lua的函数中有一个CreatePlane函数,它可以根据指定的宽度和高度创建一个平面网格,还会相应地创建一个物理半空间并添加到物理模拟中。

一个物理半空间是一个在x和z方向上无限延伸的平面。

创建好平面对象后,我们可以使用Core.SetMaterial函数来为它设置一个Ogre材质。这个材质在media/materials/base.material中定义。

沙箱已经可以处理标准的漫发射、高光和法线贴图材质类型。还可以在media/materials/ base.material文件中添加新的材质。

在示例中,我们给新创建的平面赋予了名为Ground2的Ogre材质。

Sandbox.lua:function Sandbox_Initialize(sandbox)local plane = Sandbox.CreatePlane(sandbox, 200, 200);Core.SetMaterial(plane, "Ground2");end

如果现在运行沙箱,你可能期待看到刚刚创建的平面,但实际上只会看到一个全黑的屏幕。沙箱中如果没有光照,即使创建了平面,你也看不到它。

2.7.2 添加光源

沙箱中没有光照的话,我们的平面是看不到的。沙箱的核心包提供了函数来创建灯光并设置其漫发射和高光颜色。Core.CreateDirectionalLight函数需要两个参数:沙箱和光照方向向量。使用(1,-1,1)向量可以创建一个向斜下方照射的光源。

Sandbox.lua:function Sandbox_Initialize(sandbox)...local directional = Core.CreateDirectionalLight( sandbox, Vector.new(1, -1, 1));--- Color is represented by a red, green, and blue vector. Core.SetLightDiffuse(directional, Vector.new(1.8, 1.4, 0.9)); Core.SetLightSpecular(directional, Vector.new(1.8, 1.4, 0.9));end

注意在使用Vector.new(red,green,blue)函数设置光源漫反射和高光时,颜色值是大于1的。这使你可以调整发射光的强度。

现在我们有了一个光源,可以运行沙箱来查看之前创建的平面了。使用鼠标可以调整相机的朝向,只需要按住鼠标右键并拖动鼠标到想要朝向的方向。也可以使用键盘的W、A、S和D键来控制相机在沙箱中漫游。在按下W、A、S和D键的同时按住Shift键,则可以大幅加快相机的移动速度。

2.7.3 添加天空盒

看着无尽的黑暗不是一件有趣的事情。我们可以用Sandbox.CreateSkyBox函数来创建一个天空盒。天空盒是由在Ogre材质media/materials/skybox.material中指定的6张纹理来定义的。如果你还不知道天空盒是什么的话,可以认为天空盒就是一个有6 个面的盒子,每个面上都有一张不同的纹理。当相机在沙箱中移动时,天空盒也会跟着移动,让它看上去就像真实的天空一样。

沙箱有多个天空盒材质。你可以在任意的文本编辑器中查看skybox.material文件,以了解其他可用的天空盒纹理,以及如何创建全新的天空盒材质。

Sandbox.CreateSkyBox函数需要传入3个参数:沙箱本身、Ogre材质名和旋转向量。旋转向量的单位是角度,它的作用是在我们的天空盒上添加一个初始化的偏移量。在我们的例子中,我们把天空盒旋转180度来配合之前创建的方向光源:

Sandbox.lua:function Sandbox_Initialize(sandbox)...Sandbox.CreateSkyBox(sandbox,"ThickCloudsWaterSkyBox",Vector.new(0, 180, 0));end

现在运行沙箱,你会看到一个飘着云朵的天空和明亮的世界,如图2-2所示。


2_2

2.7.4 在沙箱中添加网格

Ogre网格在沙箱中只是一个可见的几何体,不包含任何物理表现。在沙箱中添加一个Ogre网格只需要调用Core.CreateMesh函数,传入Ogre网格文件的路径和名称。

分别使用Core.SetPosition和Core.SetRotation函数设置网格的位置和旋转:

Sandbox.lua:function Sandbox_Initialize(sandbox)...local mesh = Core.CreateMesh(sandbox, "models/nobiax_modular/modular_block.mesh"); Core.SetPosition(mesh, Vector.new(0, 1, 0)); Core.SetRotation(mesh, Vector.new(0, 45, 0));end

旋转函数的参数是一个角度向量,单位是度。例如,Vector.new(0,45,0)将让网格绕y轴旋转45度。

2.7.5 创建沙箱对象

如果你想让一个Ogre网格参与物理模拟,可以创建一个沙箱对象。Sandbox.Create Object函数会为任何的Ogre网格生成一个凸包,并让它参与物理模拟。

由于为任意网格生成物理表现是在运行时进行的,复杂的网格会延长沙箱的加载时间。在内部实现中,bullet物理引擎会生成一个简化的近似Ogre网格的凸包网格,这两个网格的顶点不是一一对应的。要记住,任何Ogre网格的物理表现都只是对原网格的近似而不是精确的复制。

现在,我们可以把之前创建的方块网格转换为真正的物理模拟对象了。

Sandbox.lua:function Sandbox_Initialize(sandbox)...local object = Sandbox.CreateObject(sandbox, "models/nobiax_modular/modular_block.mesh"); -- Set the mass of the block in kilograms.Core.SetMass(object, 15);Core.SetPosition(object, Vector.new(0, 1, 0));Core.SetRotation (object, Vector.new(0, 45, 0));end



推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • html和js代码互转,html转html5
    本文目录一览:1、html网页跳转javascript代码实现 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 引号快捷键_首选项和设置——自定义快捷键
    3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
author-avatar
BIGBANG-YG-BEAR
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有