Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как использовать Lua?  (Прочитано 21624 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
SeRzzz
Гость
« : 19-04-2004 10:32 » 

Кто знает как использовать скриптовый движок Lua?(Под Windows)
Просто то что написано в статье не работает. Нужно как-то подключить его. Помогите кто знает
Записан
Serega
Гость
« Ответ #1 : 19-04-2004 19:45 » 

Вот пример использования
Код:
extern "C" 
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <luabind/luabind.hpp>

#pragma comment(lib,"Lua.lib")
#pragma comment(lib,"LuaBind.lib")
#pragma comment(lib,"LibLuaLib+CRT.lib")

class TestClass
{
std::string str;

public:
TestClass() : str("Hello World !!!")
{
std::cout << "TestClass Object Constructed without parameter" << std::endl;
}

TestClass(std::string param) : str(param)
{
std::cout << "TestClass Object Constructed with parameter: " << str << std::endl;
}

std::string GetString()
{
return str;
}

void Print()
{
std::cout <<  str << std::endl;
}
};

void PrintFunc(TestClass& test)
{
std::cout <<  test.GetString() << std::endl;
}

void bind_TestClass(lua_State* L)
{
using namespace luabind;

module(L, "TestLibrary")
[
class_<TestClass>("TestClass")
.def(constructor<>())
.def(constructor<std::string>())
.def("get_string", &TestClass::GetString)
.def("print", &TestClass::Print)
,
def("Print", &PrintFunc)
];
}

void TestFunc(std::string str)
{
std::cout << str << std::endl;
}

void main()
{
lua_State* L = lua_open();
lua_baselibopen(L);

luabind::open(L);

bind_TestClass(L);

luabind::function(L, "test", &TestFunc);

lua_dostring(L, "test('Hello World')");

luabind::call_function<void>(L, "test", std::string("print me"));

lua_dostring(L, "obj = TestLibrary.TestClass() \n obj:print()");

lua_dostring(L, "obj = TestLibrary.TestClass('string1') \n print(obj:get_string())");

lua_dostring(L, "obj = TestLibrary.TestClass('string2') \n TestLibrary.Print(obj)");

lua_close(L);
}
« Последнее редактирование: 25-11-2007 17:16 от Алексей1153++ » Записан
Serega
Гость
« Ответ #2 : 19-04-2004 19:49 » 

Пример простой, но демострирует достаточно возможностей использования Lua

для работы потребуются:
- Lua
- LuaBind
- Boost
Записан
Serega
Гость
« Ответ #3 : 19-04-2004 22:31 » 

Что-то меня поперло писать посреди ночи, вот решил еще сделать чуть удобнее
Код:
class LuaInterpreter
{
lua_State* L;

public:
enum LuaLibraries
{
BASE = 1,
TABLE = 2,
IO = 4,
STRING = 8,
MATH = 16,
DEBUG = 32,
ALL = BASE | TABLE | IO | STRING | MATH | DEBUG
};

LuaInterpreter(LuaLibraries libs = LuaLibraries::ALL) : L(lua_open())
{
if( libs & BASE ) lua_baselibopen(L);
if( libs & TABLE ) lua_tablibopen(L);
if( libs & IO ) lua_iolibopen(L);
if( libs & STRING ) lua_strlibopen(L);
if( libs & MATH ) lua_mathlibopen(L);
if( libs & DEBUG ) lua_dblibopen(L);

luabind::open(L);
}

~LuaInterpreter() { lua_close(L); }

operator lua_State*() { return L; }

template<class Binder>
void bind(Binder& binder) { binder(L); }

template<class Func>
void bind_function(const std::string name, Func& func)
{
luabind::function(L, name.c_str(), &func);
}

template<class Ret, class Param>
Ret call_function(const std::string name, Param& param)
{
return luabind::call_function<Ret>(L, name.c_str(), param);
}

template<class Param>
void call_function(const std::string name, Param& param)
{
luabind::call_function<void>(L, name.c_str(), param);
}

void dostring(const std::string str) { lua_dostring(L, str.c_str()); }

void dofile(const std::string path) { lua_dofile(L, path.c_str()); }
};


void main()
{
LuaInterpreter lua;

lua.bind_function("test", TestFunc);

lua.dostring("test('Hello World')");

lua.call_function("test", std::string("print me"));

lua.bind(bind_TestClass);

lua.dostring("obj = TestLibrary.TestClass() \n obj:print()");

lua.dostring("obj = TestLibrary.TestClass('string1') \n print(obj:get_string())");

lua.dostring("obj = TestLibrary.TestClass('string2') \n TestLibrary.Print(obj)");
}
« Последнее редактирование: 25-11-2007 17:17 от Алексей1153++ » Записан
SeRzzz
Гость
« Ответ #4 : 20-04-2004 08:07 » new

Спасиба.
А где взять LuaBind и Boost и как настроить систему?
В библиотеке Lua куча всяких .h и .c файлов, куда их кидать или что с ними сделать?
Записан
Serega
Гость
« Ответ #5 : 20-04-2004 17:53 » 

Boost
LuaBind

Boost это библиотека шаблонов, что бы её подключить нужно в среде разработки добавить путь к ней в список поиска includ'ов и все
путь к Luabind тоже добавь
в Luabind помимо заголовков есть еще исходный код библиотеки, его можно включать в проект или собрать статическую библиотеку и подключать её (так сделал я - LuaBind.lib)

у самой Lua всего 3 .h файла, обычно все их надо включать в проект
а также подключить библиотеки Lua - Lua.lib, LibLuaLib+CRT.lib | LibLuaLib.lib

пути к .lib тоже удобно добавить в среду разработки
Записан
Serega
Гость
« Ответ #6 : 20-04-2004 18:03 » 

Да, чуть не забыл

Lua поставляется в исходниках и её сначала надо собрать

там есть makefile, но если хочешь делать это в VC бери тут файлы проекта
Записан
Serega
Гость
« Ответ #7 : 23-04-2004 07:20 » 

SeRzzz, куда ж ты пропал :?:
Интересно ведь как дела идут
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 23-04-2004 07:55 » 

Странно - он зарегистрировался и пропал Жаль
Записан

А птичку нашу прошу не обижать!!!
SeRzzz
Гость
« Ответ #9 : 26-04-2004 10:02 » 

Я скачивал всё необходимое, разбирался и всё такое. Улыбаюсь
Дела продвигаются.
Но Serega твои листинги у меня чё-то не работают  Жаль  пока.
Дело в том что я пишу курсовую. Мне нужно встроить Lua в игру, которую пишет группа ребят.
Записан
SeRzzz
Гость
« Ответ #10 : 26-04-2004 10:55 » 

Да, и ещё, где можно найти рускоязычную документацию по Boost  и Luabind? Отлично
Записан
Serega
Гость
« Ответ #11 : 26-04-2004 12:13 » 

К сожалению (а может и к счастью) английский для разработчика должен быть как родной, хотябы на уровне чтения документации Отлично
Но, ищущий да обрящет :!:
http://www.ciam.ru/~sem/texts/boost-descr.htm

И напиши что именно не работает, всегда поможем Ага
Записан
SeRzzz
Гость
« Ответ #12 : 27-04-2004 09:59 » 

СпасибА Улыбаюсь
Англицкий язык для меня КАК РОДНОЙ, а русский РОДНОЙ (на нём читать приятней, если конечно перевод качественный).

В первом листинге, на этапе компиляции было 35 ошибок.

А во втором вот что:
Код:
Compiling...
1.cpp
G:\luaprojects\FIRSTPROG\1.cpp(76) : error C2065: 'TestFunc' : undeclared identifier
G:\luaprojects\FIRSTPROG\1.cpp(82) : error C2065: 'bind_TestClass' : undeclared identifier
Error executing cl.exe.

FIRSTPROG.exe - 2 error(s), 0 warning(s)
Может я что-то не так настроил?
« Последнее редактирование: 25-11-2007 17:20 от Алексей1153++ » Записан
Serega
Гость
« Ответ #13 : 27-04-2004 13:37 » 

Судя по количеству ошибок, нужно дописать следующее
Код:
#include<iostream>
#include<string>

Ты хоть скажи на каком уровне надо обьяснять, я думал ты знаешь что такое STL

Второй листинг, это изменения для первого, я добавил один класс и переделал main
Записан
SeRzzz
Гость
« Ответ #14 : 28-04-2004 08:08 » 

Да ты прав, что такое STL я не знаю :oops: . Я вот только щас перехожу на VCPP Улыбаюсь
До этого я в основном на Delphi писал. А на Сях только графику, поэтому с STL ознакомиться не довелось Жаль .
в общем, уровень моих знаний по Сям я оцениваю как - "не очень".  Я думаю что мне достаточно будет просто пояснять что испоьзуется (ну, и пару слов о том зачем это надо), а поподробнее я сам буду разбираться.
Записан
SeRzzz
Гость
« Ответ #15 : 06-05-2004 17:22 » 

У меня ещё вопрос. Как пользоваться таблицами и метатаблицами? А то что-то у меня ничего не работает, из того что в мануале написано про таблицы. Жаль
Записан
Serega
Гость
« Ответ #16 : 06-05-2004 19:13 » 

А что ты хочешь сделать ?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines