1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/nobodies-BIN_LuaBind

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

BIN_LuaBind

BIN_LuaBind — это библиотека, похожая на luabind и tolua++, которая предоставляет простой механизм привязки C/C++ к Lua. В отличие от них, BIN_LuaBind более безопасен: слой Lua не зависит напрямую от указателей слоя C/C++, что позволяет избежать сбоя из-за диких указателей. Кроме того, BIN_LuaBind предоставляет абстрактные классы для работы с Lua_state, user data и table в C++. BIN_LuaBind используется в крупных MMORPG играх для реализации игровых скриптовых движков.

Функции:

  • Механизм привязки C/C++ к Lua;
  • Привязка модулей;
  • Привязка классов;
  • Наследование классов в C++;
  • Упаковка Lua handle;
  • Упаковка таблиц (table);
  • Упаковка userdata;
  • Поддержка пользовательских типов в механизме привязки.

Интеграция:

  1. Скачать исходный код.
  2. Использовать файлы заголовков и библиотеки из каталога bin и файлы заголовков и библиотеки Lua из каталога lib.
  3. Или использовать встроенный проект Visual Studio для создания библиотеки (.lib).

Структура каталогов:

  • src — исходный код BIN_LuaBind;
  • lib — библиотеки, от которых зависит BIN_LuaBind;
  • bin — файлы заголовков и библиотеки BIN_LuaBind;
  • test — тестовый код функций;
  • example — примеры кода;
  • script — скрипты для тестирования функций.

Документация

Механизм привязки Для использования BIN_LuaBind необходимо сначала создать модуль или класс определения, который будет экспортирован в скрипт (обратите внимание, что это не определение класса C++), используя BEGIN_SCRIPT_MODULE и BEGIN_SCRIPT_CLASS. Затем с помощью ScriptExporterManager().Export и ScriptExporterManager().ExportTo экспортируйте необходимые модули и классы в Script Handle или Script Table. Таким образом, в слое C++ содержится вся структура определения, и можно экспортировать разные модули и классы в разные Script Handle и Script Table, избегая экспорта всех определений в слой Lua.

Связь между объектами C++ и Lua Объекты слоёв Lua и C++ разделены промежуточным слоем, поэтому Lua не зависит от указателей объектов C++, а C++ не зависит от ссылок Lua. Это обеспечивает безопасность кода. После уничтожения объекта C++ в слое Lua не остаётся диких указателей на него, а после освобождения объекта Lua в слое C++ не вызываются неизвестные объекты.

Определение модуля BEGIN_SCRIPT_MODULE — начало определения модуля; END_SCRIPT_MODULE — завершение определения модуля; DEFINE_MODULE_FUNCTION — определение функции модуля.

BEGIN_SCRIPT_MODULE(moduleName)
	DEFINE_MODULE_FUNCTION(moduleFunction,  returnType, (argumentList))
	{
		return 1;
	}
END_SCRIPT_MODULE()

Определение класса DECLARE_SCRIPT_CLASS — объявление класса C++ как класса скрипта; BEGIN_SCRIPT_CLASS — начало определения класса скрипта; END_SCRIPT_CLASS — завершение определения класса скрипта; DEFINE_CLASS_FUNCTION — определение метода класса; DEFINE_STATIC_FUNCTION — определение статического метода.

class CClass
{
	DECLARE_SCRIPT_CLASS()
public:
	CClass()
	{
	}

	~CClass()
	{
	}

	void Func()
	{
	}
};

BEGIN_SCRIPT_CLASS(className, CClass)
	DEFINE_CLASS_FUNCTION(functionName, returnType, (argumentList))
	{
		return 1;
	}

	DEFINE_CLASS_FUNCTION(func, void, ())
	{	
		obj->Func();
			
		return 1;
	}

	DEFINE_STATIC_FUNCTION(newInstance, CClass*, ())
	{		
		r = new CClass();

		return 1;
	}
END_SCRIPT_CLASS()

Наследование класса DECLARE_SCRIPT_SUB_CLASS — объявление класса как подкласса скрипта; SUPER_CLASS — определение суперкласса скрипта.

class CSub : public CClass
{
	DECLARE_SCRIPT_SUB_CLASS(CClass);
}

BEGIN_SCRIPT_CLASS(subClassName, CSub)
	SUPER_CLASS(superClassName, CClass)
	DEFINE_CLASS_FUNCTION(func, void, ())
	{
		return 1;
	}
END_SCRIPT_CLASS()

Управление жизненным циклом объектов C++ Существует два способа управления жизненным циклом экспортируемых объектов C++:

  • Lua владеет (SCRIPT_OWN_OBJECTS): жизненный цикл управляется Lua, и когда объект Lua освобождается, объект C++ уничтожается.
  • Lua использует (SCRIPT_USE_OBJECTS): жизненный цикл управляется C++, и Lua выступает в роли пользователя. В SCRIPT_OWN_OBJECTS userdata помещается в слабую таблицу, а в SCRIPT_USE_OBJECTS — в сильную таблицу. Независимо от метода, если объект C++ уничтожен, ссылка Lua на объект становится пустой, и вы можете проверить, является ли объект экспортированным, с помощью obj:imported().

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

BIN_LuaBind — это библиотека, похожая на luabind и tolua++, которая предоставляет простой механизм привязки C/C++ к Lua. В отличие от них, BIN_LuaBind более безопасен: слой Lua не зависит напрямую от указателей слоя C/C++, что позволяет избежать сбоя из-за диких указателей. Кроме того, BIN_LuaBind предоставляет для Lua абстрактные классы для раб... Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/nobodies-BIN_LuaBind.git
git@api.gitlife.ru:oschina-mirror/nobodies-BIN_LuaBind.git
oschina-mirror
nobodies-BIN_LuaBind
nobodies-BIN_LuaBind
master