将Lua函数嵌入Java类的成员变量中。

尽管我正在使用 Java 编写程序,但从 C 视角回答也没问题,因为这大部分要么与语言无关,要么发生在 Lua 方面。

在我编程的游戏架构概述中,特定类别(例如:生物、物品、法术等)中的各种游戏对象从数据文件中加载。它们的大多数属性都是简单数据类型,但我希望其中一些成员实际上包含简单脚本,用于定义例如使用物品时会发生什么情况。这些脚本将非常简单,因为所有基本游戏操作都将通过 Java 中的 API 公开。Lua 只负责将这些基本函数打包在一起,并设置参数。

问题主要是关于将特定 Lua 函数的引用存储为 Java 类的成员的最佳方法。

我知道,如果将 Lua 代码存储为字符串并调用 lua_dostring,则每次调用时 Lua 都会重新编译代码。因此,需要以某种方式定义该函数,并将对此特定函数的引用包装在 Java 函数对象中。

我考虑的一种可能性是,在数据加载过程中,当加载程序在数据文件中遇到脚本定义时,它会提取该字符串,使用关联对象的唯一标识修饰函数名称,对包含完整函数定义的字符串进行 lua_dostring 调用,然后将生成的函数名称包装在 Java 函数对象中。使用 lua_dostring 运行的脚本中声明的函数应该仍会添加到全局函数表中,对吗?

我只是想知道是否有更好的方法。我承认,我目前对 Lua 的知识还比较表面和理论性,因此有可能我正在忽略一些显而易见的东西。

原文链接 https://stackoverflow.com/questions/2777843

点赞
stackoverflow用户11649
stackoverflow用户11649

只需要使用 k = luaL_ref(L, LUA_REGISTRYINDEX);,就可以将 Lua 值引用并存储为一个整数 k

在栈顶放入你要引用的 Lua 值,并调用上述函数,函数会返回一个整数 k,将其存储,需要使用该 Lua 值时,只需执行 lua_rawget(L, LUA_REGISTRYINDEX, k); 将其再次推到栈顶。当你需要释放该对象时(即在对象销毁时),调用 luaL_unref(L, k)

该方法适用于任何类型的 Lua 值,包括函数(实际上是闭包)和协程。

2010-05-06 02:13:48