天天看点

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

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

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

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

沙箱lua脚本必须实现4个全局函数供c++代码调用,它们分别是sandbox_cleanup、 sandbox_handleevent、 sandbox_initialize和sandbox_update:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

分别使用core.setposition和core.setrotation函数设置网格的位置和旋转:

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

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

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

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

继续阅读