Встраивание Lua функционирует как членские переменные в Java

Хотя программа, я продолжаю работать, находится в Java, отвечая, что это с точки зрения C прекрасно также, полагая, что большая часть из этого является или агностиком языка или происходит на стороне Lua вещей.

В схеме я имею для архитектуры игры, которую я программирую, отдельные типы игровых объектов в конкретном классе (например: создания, объекты, написания, и т.д.), загружаются из файла данных. Большинство их свойств является простыми типами данных, но я хотел бы, чтобы несколько из этих участников на самом деле содержали простые сценарии, которые определяют, например, какой объект делает, когда он используется. Сценарии будут чрезвычайно просты, так как все фундаментальные игровые действия будут выставлены через API от Java. Lua просто ответственен за строковое представление нескольких этих основных функций вместе и установку аргументов.

Вопрос в основном о лучшем способе сохранить ссылку на определенную функцию Lua как член класса Java.

Я понимаю, что, если я храню код Lua как строку и называю lua_dostring, Lua скомпилирует код, новый каждый раз, когда это называют. Таким образом, функция должна быть определена так или иначе, и ссылка на эту определенную функцию, перенесенную в функциональный объект Java.

Одна возможность, что я рассмотрел, во время процесса загрузки данных, когда загрузчик встречается с определением сценария в файле данных, это извлекает эту строку, украшает имя функции с помощью уникального идентификатора связанного объекта, называет lua_dostring на строке, содержащей полное функциональное определение, и затем переносит сгенерированное имя функции в функциональный объект Java. Функция, объявленная в скрипте, запущенном с lua_dostring, должна все еще быть добавлена к глобальной функциональной таблице, корректной?

Я просто задаюсь вопросом, существует ли лучший способ идти об этом. Я признаю, что мое знание Lua в этой точке является довольно поверхностным и теоретическим, таким образом, возможно, что я пропускаю что-то очевидное.

1
задан Zarion 6 May 2010 в 01:24
поделиться

1 ответ

просто выполните k = luaL_ref (L, LUA_REGISTRYINDEX); .

вызовите его со значением Lua, на которое вы хотите ссылаться, в верхней части стека, и он вернет целое число k . Сохраните это целое число, и когда вам понадобится значение Lua, просто выполните lua_rawget (L, LUA_REGISTRYINDEX, k); , чтобы снова поместить значение в верхнюю часть стека. Если вы хотите освободить объект (например, при уничтожении объекта), вызовите luaL_unref (L, k)

. Он работает с любыми значениями Lua, включая функции (или замыкания) и сопрограммы.

2
ответ дан 3 September 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: