starbound吧 关注:85,436贴子:923,566

回复:Starbound Lua入门教程

取消只看楼主收藏回复

之前我们分析了dash这个科技的lua脚本,得出一个结论,当玩家进入一个世界时(dash实体初始化),init函数会被调用一次,玩家离开世界时(dash实体被销毁),而update函数其实是无时无刻在被脚本引擎调用。其实也很好理解,就算再简单的游戏,无论是怪还是玩家,只要是动态的,我们都必须不停的刷新他的动画状态,一旦他的位置或者图像发生变化,我们需要重新设置,不然他就是静止的了,这就是update函数。


IP属地:上海20楼2020-05-11 22:44
回复
    对于新手来说,完全编写一个新的科技mod困难度是非常大的,我们可以借用原版的科技添加自己的逻辑代码来实现我们一开始定的目标。如何借用呢,我们已经分析了dash.lua中函数的调用规则了,所以我们可以把自己写的代码挂接到dash.lua上。具体方法:在mods文件夹建立以下结构。




    IP属地:上海21楼2020-05-11 22:44
    回复
      2026-01-07 00:16:37
      广告
      不感兴趣
      开通SVIP免广告
      这是标准的patch结构,相信你已经很熟悉了,我们对dash.tech 这个json文件进行patch,给dash.tech的scripts属性值增加一个demo.lua。


      IP属地:上海22楼2020-05-11 22:45
      收起回复
        在demo.lua中写入以下代码


        IP属地:上海23楼2020-05-11 22:46
        回复
          这就是一个最简单的lua类型Mod了,在打开游戏后,你会发现效果和我们刚开始前直接改动源文件一样。简单的看一下这段代码,当我们在 dash.tech 中的scripts属性中加入了demo.lua后,科技实体在加载dash.lua时也会加载demo.lua。demo.lua做的事很简单,把原来dash.lua中的init,update、uninit函数都先保存到变量ini、upd、uni中,自己定义了init()、update()、uninit()这些由脚本引擎自动调用的函数,相当于覆盖了原来dash.lua的这些函数。


          IP属地:上海24楼2020-05-11 22:46
          回复
            那之后脚本引擎就会调用demo.lua中的init、update、uninit函数了。但是我们需要同时调用一下原来dash.lua的这些函数,不然dash这个科技原来自己的功能就没有了,所以会有这样一个架构,这也是一个通用的挂接型模板。那么下面的事就很简单了,你可以在你自己写的demo.lua中随意发挥了。


            IP属地:上海25楼2020-05-11 22:46
            回复
              第四篇:Lua mod编写(下)


              IP属地:上海26楼2020-05-11 23:17
              回复
                为了实现瞬移到光标位置,我们要来查文档了,看看有没有设置玩家位置的函数。定位到actormovementcontroller这个文档,可以看到有一个函数“mcontroller.setPosition”,这个就可以设置当前实体的位置了,可能是玩家也以是monster、npc。看你把这个函数用在哪里了。这里我们用在科技实体上当然是设置的玩家的位置了。有人可能会问你怎么找的这些函数,官方提供了很多函数,这需要你经常去翻这些文档,每条函数的下面都写了他的作用。这个函数接收一个位置参数,但是这个参数类型是Vec2F,这是什么类型?并不是lua的基础类型。


                IP属地:上海27楼2020-05-11 23:18
                回复
                  2026-01-07 00:10:37
                  广告
                  不感兴趣
                  开通SVIP免广告
                  你可以用FileLocator去搜索解包文件中的lua文件,肯定有Lua文件用到这个函数,然后看看他的参数怎么定义的。这里我就直接说吧,Vec2F其实就是个两元素的数组。比如mcontroller.setPosition({200,300}),这句话就可以把你设置到你当前世界的(200,300)坐标。下面就是把这句话加到我们的demo.lua中,先加到init中,看看有没有效果。


                  IP属地:上海28楼2020-05-11 23:18
                  回复
                    这里教大家一个快速调试的办法,在游戏中用/reload就能让游戏重新加载修改后的文件。可以看到我一用/reload结束,人物就被设置到200,300这个位置了(使用指令/debug可以看到调试信息),调试的时候最好,把这个坐标改一改,这个坐标可能是个虚空。


                    IP属地:上海29楼2020-05-11 23:20
                    回复
                      当然这个函数放在init中只是为了测试而已,我们的目标是按下键盘的G后把自己瞬移到光标位置。在update中加入以下代码。


                      IP属地:上海30楼2020-05-11 23:21
                      回复
                        args.moves['special2'] 其实就是获取当前的键盘G键按下信息,关于args的结构如下:


                        IP属地:上海31楼2020-05-11 23:22
                        回复
                          科技lua的args参数可获取的值非常丰富,这也是为什么选择把自己要实现的功能挂接到科技lua上,根据moves表,我们可以判断是否按下了一些键。


                          IP属地:上海32楼2020-05-11 23:22
                          回复
                            可以判断的键有这些up、down、left,right,special1、special2、special3。其中special1、special2、special3分别对应键盘上的F、G、H(默认情况,你可以在设置里改),up、down、left、right比较好理解不多说了。


                            IP属地:上海33楼2020-05-11 23:23
                            回复
                              2026-01-07 00:04:37
                              广告
                              不感兴趣
                              开通SVIP免广告
                              primaryFire、altFire分别对应鼠标左键和右键。此外还能获取到当前人物是否是跑动的比如run。这些都是科技lua独有的,假如你用的其他实体的lua比如activeitem就不一样了。


                              IP属地:上海34楼2020-05-11 23:23
                              回复