上篇教程我们讲解了如何制作一个简单的脚本,也提出了脚本的一些问题,大家是否已经有了解决这些问题的方案了呐,接下来我们来讲解如何解决这些问题和使用引擎重构这个脚本。
还记得我们上期写的脚本吗,我们要在切换地图后清除掉记录的数据,同时要解决被墙挡住的问题。
首先我们使用LuaEngine的另一个函数调用on_switch_scenes,这个函数会在每次地图更换时执行,我们在这里清除掉之前记录的坐标
这样我们每次更换地图后,坐标数据就会被清除,不会出现传送到了异常位置的情况了。
接下来我们通过ct表得知玩家有一个碰撞折返坐标的地址偏移是A50、A54、A58,我们需要在修改玩家坐标的同时,将碰撞折返坐标也修改成记录的坐标,这样及时发生了撞墙判定,折返到的坐标也是我们的目标坐标,经过修改后,我们的代码如下
到此我们之前的小问题就解决完成了。但是这样写出来的代码大家发现并不简单是不是,下面我们将使用LuaEngine的引擎部分对代码进行简化。
首先,我们不需要再手动获取玩家的实体地址,甚至是玩家的坐标,可以通过引擎进行获取,我们要做的是先实例化玩家数据local Data_Player = engine.Player:new()此项操作后我们可以从Data_Player中获取玩家的各项数据,比如玩家的坐标Data_Player.Position.position,接下来我们修改下代码,简化流程。
这里可以看到,我们将PlayerPos的三轴坐标从nil改为了0,这里是应为引擎定义的空值为0,这里为了配合引擎使用同样取初始值为0,通常情况下很难出现三个轴都为0的时候,所以这里判断是否为nil和是否为0区别不大。
接下来我们对快捷键部分进行一下优化,使用引擎的按键处理引擎功能,我们可以更直观的编写快捷键判断代码,接下来为了演示代码我们修改一下设定,当按下小键盘0和.时,记录当前位置,当按下小键盘0时传送。首先我们了解一下按键处理引擎engine.keypad,这个功能接收一个字符串或表,当参数为字符串时根据内容判断按键是否按下,当参数为table时根据表中所有字符串判断组合键是否按下。engine.keypad内置了大部分键盘按键,不需要区分大小写,比如我们要用到的小键盘0是Num0,你传入'Num0'和传入'NUM0'是没有区别的。接下来我们修改一下代码让快捷键判断更加直观,同时我们将修改玩家坐标的函数和记录玩家坐标的函数内容直接放入on_time中,由于代码的优化,内容较少的情况下可以写在一起。
现在我们的代码是不是更加简洁,更加直观了。关于引擎内的功能和数据,可以在Engine.lua和modules文件夹中的lua文件中找到,后续的教程中我们也会详细讲解这些内容,这些引擎均为Lua代码实现,从原理上将跟我们实现的这个脚本没有太大差别。
本篇教程到此结束,下一篇教程我们将讲解LuaEngine的全部内置功能以及使用时的注意事项,尽请期待。