gpt4 book ai didi

java - 在Java中嵌入Lua函数作为成员变量

转载 作者:行者123 更新时间:2023-11-30 05:12:48 25 4
gpt4 key购买 nike

虽然我正在开发的程序是用 Java 编写的,但从 C 角度回答这个问题也很好,考虑到大多数问题要么与语言无关,要么发生在 Lua 方面。

在我正在编程的游戏架构的大纲中,特定类中的各个类型的游戏对象(例如:生物、元素、咒语等)是从数据文件加载的。它们的大多数属性都是简单的数据类型,但我希望其中一些成员实际上包含简单的脚本,例如定义某个项目在使用时执行的操作。脚本将非常简单,因为所有基本的游戏操作都将通过 Java 的 API 公开。 Lua 只是负责将这些基本函数串联在一起,并设置参数。

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

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

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

我只是想知道是否有更好的方法来解决这个问题。我承认我目前对 Lua 的了解还相当肤浅和理论化,所以我可能忽略了一些明显的东西。

最佳答案

就做 k = luaL_ref(L, LUA_REGISTRYINDEX); .

用你想在栈顶引用的Lua值来调用它,它将返回一个整数k 。存储这个整数,当你需要 Lua 值时只需执行 lua_rawget(L, LUA_REGISTRYINDEX, k);将值再次插入堆栈顶部。当您想要释放对象时(即对象销毁时),请调用 luaL_unref(L, k)

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

关于java - 在Java中嵌入Lua函数作为成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com