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

OSCHINA-MIRROR/brinkqiang-dmsolpp

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

dmsolpp

Авторское право (c) 2013-2018 brinkqiang (brink.qiang@gmail.com)

dmsolpp License blog Open Source Love GitHub stars GitHub forks

Статус сборки

Linux Mac Windows
lin-badge mac-badge win-badge

Введение

dmsolpp

экспорт флагов // export_begin // export_end

#ifndef __OBJECT_H_INCLUDE__
#define __OBJECT_H_INCLUDE__

#include <stdint.h>

class CObject
{
public:
// export_begin
    CObject(): m_objID(0){}
    virtual ~CObject(){}
    uint64_t GetObjID(){ return m_objID;}
    void SetObjID(uint64_t id){ m_objID = id;}
// export_end
private:
    uint64_t m_objID;
};

#endif // __OBJECT_H_INCLUDE__

команда

dmsolpp --PKG=interface.pkg

выходные данные

interface.sol.cc
interface.sol.h

addmodule

oDMLuaEngine.AddModule(require_interface);
``````cpp
#include "gtest.h"
#include <cstddef>
#include "interface.sol.h"
#include "player.h"
#include "dmsolpp.h"
```TEST(DoSolpp, DoSolpp)
{
    CDMLuaEngine oDMLuaEngine;

    std::string strScriptRootPath = DMGetRootPath();
    oDMLuaEngine.SetRootPath(strScriptRootPath + PATH_DELIMITER_STR + ".." + PATH_DELIMITER_STR + "script");

    // Загрузка автоматически сгенерированного кода модуля, если у вас есть несколько модулей, их нужно добавить здесь
    oDMLuaEngine.AddModule(require_interface);

    // Использование dmlua для загрузки, так как он может автоматически загружать все файлы из указанной директории. Сам движок sol этого не поддерживает.
    if (!oDMLuaEngine.ReloadScript())
    {
        ASSERT_TRUE(0);
        return;
    }

    oDMLuaEngine.DoString(R"(
        function add(a, b)
            return a + b
        end
        )");

    oDMLuaEngine.DoString(R"(
        function addplayer(player)
            print("[addplayer]: " .. player:GetName())
            return 1
        end
        )");

    // Получение движка sol
    auto state = oDMLuaEngine.GetSol();

    int num = state["add"](1, 2);

    CPlayer oPlayer(5, "zhangsan");
    int ret = state["test"]["main"]["dowork"](&oPlayer);

    int ret2 = state["addplayer"](oPlayer);

    // Использование объектного менеджера из lua-скрипта для создания объектов, управление жизненным циклом объектов осуществляется lua, после перезагрузки данные теряются
    auto script_result = state.safe_script(R"(
        local interface = require("interface")
        local player_mgr = require("player")
        local player = player_mgr.create_player()
        local p = player_mgr.find_player(player:GetObjID())
    )");
```        p:Init()
        p:NotChange()
        p.OnChange = function (self) print("Изменение в lua") end
        p:OnChange()
        print(MAX_NAME_LEN)
        print("[1]" .. interface.GNextID())
        print("[2]" .. p.NextID())
        p:SetObjID(interface.GNextID())
        print("[3]" .. p:GetObjID())
        p:SetHP(interface.GNextID())
        print("[4]" .. p:GetHP())
        print("[5]" .. interface.CPlayer.NextID())
        player_mgr.release_player(p)
        print("в sol2.lua player_mgr.create_player");
        )", sol::script_throw_on_error)
    ASSERT_TRUE(script_result.valid())```markdown
    // Использование импортированного C++ объектного менеджера для создания объектов, управление жизненным циклом объектов осуществляется C++, после перезагрузки данные сохраняются
    auto script_result2 = state.safe_script(R"(
        local interface = require("interface")
        local player = interface.create_player()
        local p = interface.find_player(player:GetObjID())
        p:Init()
        p:NotChange()
        p.OnChange = function (self) print("OnChange в lua") end
        p:OnChange()

        interface.release_player(player:GetObjID())
        print("в sol2.cpp player_mgr.create_player")
        )", sol::script_throw_on_error);
    ASSERT_TRUE(script_result2.valid());
}
/********************************************************************
**       Этот файл C++ сгенерирован программой,                     **
**            Пожалуйста, не изменяйте его напрямую.               **
**                   Автор: brinkqiang                             **
********************************************************************/
// источник: interface.pkg

#include "interface.sol.h"
#include <limits>

#include "object.h"

#include "creature.h"

#include "player.h"

#include "playermgr.h"

#include "common/types.h"

#include "common/enum.h"

#include "common/macros.h"

#include "common/struct.h"

#include "common/template.h"


#include "sol/sol.hpp"
```namespace lua_module_interface
 {
     static sol::table require_api(sol::this_state L)
     {
         sol::state_view lua(L);
         sol::table модуль = lua.create_table();
         модуль.new_usertype<CObject>(
             "CObject",
             sol::constructors<CObject()>(),
             sol::meta_function::garbage_collect, sol::destructor([](CObject& temp) { temp.~CObject(); }),
             sol::base_classes, sol::bases<>()
             "GetObjID", sol::make_reference<sol::function>(lua.lua_state(), &CObject::GetObjID),
             "SetObjID", sol::make_reference<sol::function>(lua.lua_state(), &CObject::SetObjID)
         );
         модуль.new_usertype<CCreature>(
             "CCreature",
             sol::constructors<CCreature()>(),
             sol::meta_function::garbage_collect, sol::destructor([](CCreature& temp) { temp.~CCreature(); }),
             sol::base_classes, sol::bases<CObject>(),
             "SetHP", sol::make_reference<sol::function>(lua.lua_state(), &CCreature::SetHP),
             "SetMP", sol::make_reference<sol::function>(lua.lua_state(), &CCreature::SetMP),
             "GetHP", sol::make_reference<sol::function>(lua.lua_state(), &CCreature::GetHP),
             "GetMP", sol::make_reference<sol::function>(lua.lua_state(), &CCreature::GetMP)
         );
         модуль.set_function("GNextID", &GNextID);
         модуль.new_usertype<CPlayer>(
             "CPlayer",
             sol::constructors<CPlayer(), CPlayer(int, const std::string&), CPlayer(const std::string&)>(),
             sol::meta_function::garbage_collect, sol::destructor([](CPlayer& temp) { temp.~CPlayer(); }),
             sol::base_classes, sol::bases<CCreature, CObject>(),
             "DoAction", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::DoAction),
             "Init", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::Init),
             "OnChange", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::OnChange),
             "NotChange", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::NotChange),
             "SystemChange", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::SystemChange),
             "LoadFromDB", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::LoadFromDB),
             "SaveDB", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::SaveDB)
         );
     }
 }```markdown
lua_state(), &CPlayer::SaveDB)
              , "GetName", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::GetName)
              , "NextID", sol::make_reference<sol::function>(lua.lua_state(), &CPlayer::NextID)
               );
          module.set_function("create_player", &create_player);
 module.set_function("find_player", &find_player);
 module.set_function("release_player", &release_player);
 module.new_usertype<CPlayerMgr>(
     "CPlayerMgr"
     , sol::constructors<>()
     , sol::base_classes, sol::bases<>()
     , "create_player", sol::make_reference<sol::function>(lua.lua_state(), &CPlayerMgr::create_player)
     , "find_player", sol::make_reference<sol::function>(lua.lua_state(), &CPlayerMgr::find_player)
     , "release_player", sol::make_reference<sol::function>(lua.lua_state(), &CPlayerMgr::release_player)
 );
 module.new_usertype<STaskInfo>(
     "STaskInfo"
     , sol::constructors<STaskInfo()>()
     , sol::meta_function::garbage_collect, sol::destructor([](STaskInfo& temp) { temp.~STaskInfo(); })
     , sol::base_classes, sol::bases<>()
     , "nTaskID", &STaskInfo::nTaskID
     , "nTaskState", &STaskInfo::nTaskState
     , "nTaskCondition", &STaskInfo::nTaskCondition
 );
 module.new_usertype<SPos>(
     "SPos"
     , sol::constructors<SPos(),SPos(int,int,int)>()
     , sol::meta_function::garbage_collect, sol::destructor([](SPos& temp) { temp.~SPos(); })
     , sol::base_classes, sol::bases<>()
     , "x", &SPos::x
     , "y", &SPos::y
     , "z", &SPos::z
 );
 return module;
 }
LUA_API int luaopen_interface(lua_State* L)
{
    return sol::stack::call_lua(L, 1, lua_module_interface::require_api);
}
```LUA_API int require_interface(lua_State* L)
{
    luaL_requiref(L, "interface", luaopen_interface, 0);
    printf("lua модуль: require interface\n");
    return 1;
}

Контакты

Благодарности


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

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

Введение

Реализация bind для автоматизации процесса импорта C++ библиотек в Lua с использованием sol2. Эта библиотека предназначена для упрощения процесса импорта C++ библиотек в Lua путём автоматического создания кода привязки на основе анализа заголовочных файлов. Благодаря эффективному механизму привязки sol2, можно легко экспортировать существующие ... Развернуть Свернуть
MIT
Отмена

Обновления

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

Участники

все

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

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