LUA扩展 apollo 使用经验教程
yunzl 发表于 2018-07-18 11:11:20 412

http://www.52gmk.com/thread-1615.htm

本体在这,这个破玩意当初花了一笔不小的银子(众筹)

他的函数不是很多,但你需要了解的其实也就几个


第一,lua_state_create()

什么意思呢,创建一个lua状态,就跟你创建了一个实例返回的实例id一样

你需要使用这个状态来干各种各样的事


第二,lua_add_function(lua状态,"lua内函数名",gm脚本id)

把一个gm的脚本注册给一个lua状态的变量里

实际操作是这样的


//ab(a,b) 这个函数是用户脚本
return argument0+argument1
lua_add_function(L,"ab",ab)

这样你在lua里就可以使用ab()来调用gm的ab()脚本了,非常的简单

值得注意的是,因为实现是用的script_execute而sbyoyo特有的奇异的居然不支持插件脚本

所以注册的脚本必须是在资源树里的,需要小心


第三,lua_add_code(lua状态,"lua代码"),lua_add_file(lua状态,"文件路径,可穿沙盒")

没啥说的,肆意奔跑的你的lua脚本


就是这么简单,完。。。。。。。。。





当然没那么简单了,这点玩意还值不上我发个帖子

现在来给大家说一下自带工程里的代码


for (i = 0; sprite_exists(i); i += 1) {
    lua_global_set(live_state, sprite_get_name(i), i);
}
for (i = 0; object_exists(i); i += 1) {
    lua_global_set(live_state, object_get_name(i), i);
}

这俩for的作用是把所有的精灵和OBJ注册给lua

当然,只是变量名和内部id

/// ref_variable_instance_init(lua_state)
var q = argument0;
lua_add_function(q, "variable_instance_get", ref_variable_instance_get);
lua_add_function(q, "variable_instance_set", ref_variable_instance_set);
lua_add_code(q, @"-- ref_variable_instance_init()
    __idfields = __idfields or { };
    debug.setmetatable(0, {
        __index = function(self, name)
            if (__idfields[name]) then
                return _G[name];
            else
                return variable_instance_get(self, name);
            end
        end,
        __newindex = variable_instance_set,
    })
");

外面那些gm代码不看,我们来看里面的lua代码

__idfields = __idfields or { };
//这里or是个很经典的写法,如果左边为空则赋值右面,也就是个检查为空则创建一个表
__index = function(self, name) ... end
//这里lua里元方法的使用,你在lua里的对表进行调用操作就会触发这个__index函数
__newindex = variable_instance_set
//同上,不过是赋值操作触发

通过修改了两个元方法,接管了赋值和调用

/// ref_variable_instance_set(context, name, value)
var q = argument0, s = argument1, v = argument2, n = 0;
//根据lua的调用,arg0是代表实例的id,arg1是变量名,arg2是赋值内容
with (q) { variable_instance_set(id, s, v); n++; }
//这里使用了一个with,用意是如果q是个父类可以同时操作子
if (n) exit;
//成功运行退出

//如果n++没运行到,那么代码就会跑到这里,检测q是不是实例
if (q < 100000) {
    lua_show_error("Couldn't find any instances of " + string(q) + " (" + object_get_name(q) + ")");
} else lua_show_error("Couldn't find instance " + string(q));
/// ref_variable_instance_get(context, name)
var q = argument0, s = argument1;
with (q) return variable_instance_get(id, s);
//返回实例的某个变量
if (q < 100000) {
    lua_show_error("Couldn't find any instances of " + string(q) + " (" + object_get_name(q) + ")");
} else lua_show_error("Couldn't find instance " + string(q));
return undefined;

也就是说,如果你通过储存实例id的变量进行读写,

例如object0.x=1,就会接管到gm里操作

达成了gm实例映射进lua的作用,

实在是非常的不错,虽然有点小问题


下面是我打包的代码,包括上面三个修改过的ref和live代码

还有我正则出来的gms2用的全函数注册脚本

注意,关掉设置里拖入资源打开,不然爆炸到你怀疑人生

以上

上传的附件:
最新回复 (5)
  • kekexinqing 发表于 2018-10-10 06:24:33
    0 2
    https://yellowafterlife.itch.io/gamemaker-lua
    楼主有上面地址的源码吗?
  • yunzl 发表于 2018-10-11 12:40:09
    0 3
    kekexinqing https://yellowafterlife.itch.io/gamemaker-lua 楼主有上面地址的源码吗?
    人家卖钱的怎么可能给你源码,下载地址看第一行,弟弟
  • kekexinqing 发表于 2018-10-11 09:12:15
    0 4
    因为你是出钱买了插件的啊。我以为都会一起送给你。
  • kekexinqing 发表于 2018-10-11 09:15:29
    0 5
    不过我自己看了下,里面有个demo可以免费下,然后里面包含了dll文件。这个dll文件就是插件了。然后gamemaker本身可以用dll文件的。然后它有个帮助文档,里面有全部的函数。昨天自己试着用那个dll文件,做了个gm8插件貌似可以用23333。这算是bug么。免费的demo就公布了插件,也是服了。
  • yunzl 发表于 2018-10-12 08:06:29
    0 6
    kekexinqing 不过我自己看了下,里面有个demo可以免费下,然后里面包含了dll文件。这个dll文件就是插件了。然后gamemaker本身可以用dll文件的。然后它有个帮助文档,里面有全部的函数。昨天自己试着用那个 ...
    这个东西有价值的其实还是上面我提到的几个脚本