GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (160 стр.)

Сообщения на форуме пользователя Andrey (160 стр.)

Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.30 окт. 200613:01#23
Дмитрий Ясенев
ошибка:
Lua API: A runtime error, Description: scripts/1.lua:13: bad argument #1 to 'insert' (table expected, got nil)
cal3d и озвучка.30 окт. 200612:39#12
>ага OpenSceneGraph у меня фрейм-ворк на нем основан и Кал3д через него щас юзаю.
ух-ты  а ты сним разобрался? я думал что это не очень распространенная библиотека... у тебя какя версия? у меня 1.2
а как ты через нее используешь cal3d? это же либа скелетной анимации какое- это отношение имеет к графу сцены? или ты прсото модель как узел сцены подразумеваешь?
>а что за бв?
бы!!!! ;)
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.30 окт. 200611:55#21
Итак у меня появились еще вопросы.
Имеем массив игровой объект данные которого в классе C++(для простоты взял только 2 поля):
class GameObjectData {
public:
  GameObjectData() {};
  bool isEmpty;
  int curState;
};
вот связка через luabind членов класса таблицей в Lua:
luabind::module(L)
    [
      luabind::class_<GameObjectData>("GameObjectData")
      .def(luabind::constructor<>())
      .def_readwrite("isEmpty", &GameObjectData::isEmpty)
      .def_readwrite("curState", &GameObjectData::curState)
    ];
// объяляем указатель на игровые данные
GameObjectData *gameData = NULL;
luaManager.CallFunction(func); // вызываем функцию скрипта func == "Get"
// получаем указатель, gameObjectData  - это таблица хранящая данные класса GameObjectData
objectData = luabind::object_cast<GameObjectData *>(luabind::globals(L)["gameObjectData"]);
// далее просто в цикле повторно в качестве теста вызываем функцию обновляющую игровые данные:
for(size_t j = 0; j < 30; ++j) {
  luaManager.CallFunction(func); // func == "Get"
  fprintf(stderr,"%s%d%s%s", "State: ",
      objectData->curState, 
      " Empty: ", objectData->isEmpty ? "true" : "false\n");    
}
вот работающий скрипт:
gameObjectData = nil;

function Get()
-- если вызываем первый раз то создаем таблицу
  if (gameObjectData == nil) then
    gameObjectData = GameObjectData();
  end;
-- тестовая реализация обновления игровых данных
  if (math.random(10, 100) > 50)  then
     gameObjectData.Empty = true;
    gameObjectData.curState = math.random(10, 100);
  else
    gameObjectData.Empty = false;
    gameObjectData.curState = math.random(0, 9);
  end;
end;
Все хорошо работает, но вот никак не могу сделать это для массив объектов, т.е. в этом случае будет массив указателей на
GameObjectData
Делаю так(пишу только измененный код):
// пока для 2 элементов
GameObjectData *objectData[2];  
...
for(size_t i = 0; i < sizeof(objectData) / sizeof(objectData[0]); ++i) {
  objectData[i] = luabind::object_cast<GameObjectData *>(luabind::globals(L)["gameObjectData"]);
}
каким тогда должен быть скрипт, если это массив?
я попробовал сделать так:
gameObjectData = {}; -- возможно тут будет nil, а не пустая таблица т.к. luabind ее создала.

init = false;

function Get()
  if (init == false) then    
    gameObjectData = {};
-- мне кажеться что-тут не надо вставлять данные т.к. вроде это сделала luabind
    table.insert(gameObjectData, {isEmpty = false, curState = 1});
    init = true;
  end;
-- тестовая реализация обновления игровых данных
  if (math.random(10, 100) > 50)  then
     gameObjectData[1].Empty = true;
    gameObjectData[1].curState = math.random(10, 100);
     gameObjectData[2].Empty = true;
    gameObjectData[2].curState = math.random(10, 100);
  else
    gameObjectData[1].Empty = false;
    gameObjectData[1].curState = math.random(0, 9);
     gameObjectData[2].Empty = true;
    gameObjectData[2].curState = math.random(10, 100);
  end;
end;
Естественно ничего не работает и кидаеться исключение luabind::cast_field:
irst-chance exception at 0x7c81eb33 in LuaTestd.exe: Microsoft C++ exception: luabind::cast_failed @ 0x0012f720.
Unhandled exception at 0x7c81eb33 in LuaTestd.exe: Microsoft C++ exception: luabind::cast_failed @ 0x0012f720.
Как мне исправить скрипт или я что-то неправильно слделаю в C+ коде?
Требуется помощь с Lua27 окт. 200619:00#10
>А есть где-ниудь доки на русском ??? Можно конечно и на английском, но чтобы более доходчиво для новичков, ибо мануалы на >сайте ужасно непонятные.
смотри книгу с сайта могу дать статтью рецепты Lua
и СРАЗУ ЖЕ БЕРИСЬ ЗА luabind !!!!
вот смотри меня убедили
http://www.gamedev.ru/code/forum/?id=56312
сегодня почти переделал все ядро игровой логики
Требуется помощь с Lua27 окт. 200618:44#8
SeeD
luaL_dostring() ?
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.27 окт. 200614:40#18
Дмитрий Ясенев
>а зачем так делать? в духе ООП было бы держать в каждом объекте экземпляр класса GameObjectData, и напрямую менять >данные прямо у объекта, который вам интересен.
да я так уже подумал что будет правильно :)
я думаю отставить все как есть и уже простетировал простешйи скрипт который просто меняет эти данные.
т.е. я так думаю быстродейстиве повыситься т.к. на стек будет класться только имя скриптовой функция, а раньше еще и 20 переменных.
cal3d и озвучка.27 окт. 200614:31#10
>И еще один вопрос: ты случайно cal3d не через OSG юзаешь ?
это что Open Scene Graph ???
да нет внедрил в движок  да еще и перегнал все файлы в 1 двоичный что-бв не взяли :)
ну вот осталось еще можель перевернуть
Ошибка в исходном коде воды27 окт. 200614:12#2
Osiris
попробую помочь стукни в аську...
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.27 окт. 200614:10#16
IROV..
итак ошибка исправлена я передавал не ту перменную:
// регистрируем Lua объект я так понимаю к нему можно обращаться как к таблице из Lua скриптов
objectData = luabind::object_cast<GameObjectData *>(luabind::globals(L)["gameObjectData"]);
ну ты если не сложно все-таки пришли новый luabind
я тему закрывать не буду еще бедет вопросы.
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.27 окт. 200612:25#15
IROV..
>приведи весь код инициализации.
а тут только перед  этом:
// открыть для luabind
luabind::open(luaState);
естественнно открываю через lua_open загружаю либы и т.д.
>и еще какой lua используеш?
Lua 5.1.1 Copyright (C) 1994-2006 Lua.org, PUC-Rio R. Ierusalimschy, L. H. de Figueiredo & W. Celes
>офиц версия 0.7 не работает с 5.1 имено оно и вызывает рунтайм ерор )
пожалуйста скинь поновей :(
проблемы с CVS будут

Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.27 окт. 200610:59#13
Дмитрий Ясенев
итак я разобрался с ошибкой:
вот поправленный код:
...
try {  
    luabind::module(L)
    [
      luabind::class_<GameObjectData>("GameObjectData")
      .def(luabind::constructor<>())
      .def_readwrite("isEmpty", &GameObjectData::isEmpty)
      .def_readwrite("curState", &GameObjectData::curState)
    ];
    luabind::globals(L)["gameObjectData"]=gameObjectData;//boost::ref(gameObjectData);
  }
  catch (const std::bad_exception& ex) {
    fprintf(stderr, "%s", ex.what());
  }
....
но теперь в Debug  выскакивет ошибка:
Изображение удалено
а в Release вообще все падает.
В процессе отладки по исходникам luabind и boost рузультатов не дало...
>во-вторых, не совсем понял, зачем вам общая переменная gameObjectData? вы же можете создавать её в скрипте и >использовать для каждого объекта свою, как и предполагалось (иначе зачем вы экспортите конструктор?).
ну а как тогда можно "привязать" указатели на данные этой структуры каждого объекта к таблице?
Еще вопрос вдогонку я так понимаю что в скрипте с учетом данного подхода мы просто можем обращаться к структуре что-то типа что-то такого:
...
-- gameObjectData[] - таблица содержащая данные всех игровых объектов
-- ID - индекс текущего объекта
gameObjectData[ID].isEmpty = true;
gameObjectData[ID].curState = 1;
...
?

Правка: 27 окт. 2006 11:13

Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.26 окт. 200618:01#11
Привет всем копаю luabind
столкнулся с ошибкой:
#include <luabind/luabind.hpp>
....
class GameObjectData {
public:
  GameObjectData() {};
  bool isEmpty;
  int curState;
};
...
GameObjectData gameObjectData;
// определяем класс определяем конструктор и указатели на переменные
luabind::module(L)
  [
    luabind::class_<GameObjectData>("GameObjectData")
    .def(luabind::constructor<>())
    .def_readwrite("isEmpty", &GameObjectData::isEmpty)
    .def_readwrite("curState", &GameObjectData::curState)
  ];
// регистрируем Lua объект я так понимаю к нему можно обращаться как к таблице из Lua скриптов
luabind::get_globals(L)["gameObjectData"]=boost::ref(gameObjectData);
итак при компиляции возникает ошибка :(
LuaTest\test.cpp(460) : error C2039: 'get_globals' : is not a member of 'luabind'
LuaTest\test.cpp(460) : error C3861: 'get_globals': identifier not found, even with argument-dependent lookup
что я делаю не так???
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.25 окт. 200618:21#10
Дмитрий Ясенев
угу спасибо за ссылку буду копасть ;)
Наложение таблицы(таблиц) Lua на структуру(массив структур) C++.25 окт. 200618:18#9
Lion007
>зы : если надо подробностей - их есть у меня
может в аське??? ;)

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр