Как добавить пространства имен в Lua? - PullRequest
1 голос
/ 09 июля 2020

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

print(transform.position.x)
transform.position.x = 10

Я написал геттер и сеттер для позиции, я бы хотел, чтобы они содержались в transform.position, и предпочтительно вообще не быть геттерами и сеттерами, а скорее вести себя как члены publi c. Мой текущий метод получения и установки выглядит следующим образом:

int getXPosition(lua_State* L) {
    lua_pushnumber(L, Script::currentEntity->get<Transform>().position.x);

    return 1;
}

Итак, как это будет сделано, если это вообще возможно?

1 Ответ

1 голос
/ 09 июля 2020

Короткий ответ: это можно сделать с помощью userdata и metatables .

Подробнее:

  1. Register metatable который будет "классом" для объекта position и зарегистрирует для него "__index" и "__newindex" метаметоды:

     luaL_newmetatable(L, "position_metatable");
     lua_pushcfunction(L, &position__index);
     lua_setfield(L, -2, "__index");
     lua_pushcfunction(L, &position__newindex);
     lua_setfield(L, -2, "__newindex");
     lua_pop(L, 1);
    
  2. Функция записи position__index (это геттер ). Это обычная функция C Api, она принимает 2 аргумента: данные пользователя position и имя поля. Если имя поля - "x", функция должна вернуть значение поля x.

  3. Функция записи position__newindex (это сеттер). Это обычная функция C Api, она принимает 3 аргумента: данные пользователя position, имя поля и записываемое значение. Если поле - "x", функция должна записать значение в поле x.

  4. Чтобы передать объект position из собственного кода в скрипт, создайте пользовательские данные и установите "position_metatable" в качестве метатаблицы для пользовательских данных, см. 28.2 - Метатаблицы , например.

  5. Доступ к полю как transform.position.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...