Создание таймеров в C ++ с использованием Lua - PullRequest
0 голосов
/ 22 сентября 2010

Мне было интересно, подойдут ли следующие настройки для небольшой игры:

Предположим, у меня есть следующие зарегистрированные в Lua функции, например:

lua_register(L, "createTimer", createTimer);
lua_register(L, "getCondition", getCondition);
lua_register(L, "setAction", setAction);

Где: (оставляяпроверка типа)

int createTimer(lua_State* L){
    string condition = lua_tostring(L, 1);
    string action = lua_tostring(L, 2);
    double timer = lua_tonumber(L, 3);
    double expiration = lua_tonumber(L, 4);

    addTimer(condition, action, timer, expiration); // adds the "timer" to a vector or something
 return 1;
}

Вызов этой функции в lua по:

createTimer("getCondition=<5", "setAction(7,4,6)", 5, 20);

Могу ли я тогда сделать следующее (?):

// this function is called in the game-loop to loop through all timers in the vector
void checkTimers(){
    for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
        if(luaL_doString(L, *it->condition)){
            luaL_doString(L, *it->action)
        }
    }
}

Будет ли этоРабота?Будет ли luaL_doString передавать "getCondition = <5" в механизм состояний lua, где он вызовет функцию getCondition () из c ++, а затем посмотрит, если это = <5 и вернет true или false?И то же самое относится к luaL_doString (L, "setAction (7, 4, 6)");?</p>

Более того, будет ли это подходящим способом для создания таймеров, если один раз получить доступ к lua ​​(для их создания) и позволить c ++ обрабатывать все остальное, вызывая только функции c ++ через lua и позволяя lua иметь дело только с логикой?1017 *

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Возможно, вы захотите изменить строку условия на "return getCondition()<=5", иначе строка строки не будет скомпилирована или запущена.Затем проверьте логическое возвращаемое значение в стеке, когда luaL_doString() вернется успешно.Как то так:

// this function is called in the game-loop to loop through all timers in the vector
void checkTimers(){
    for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
        lua_settop(L, 0);
        if(luaL_doString(L, *it->condition) == 0 && lua_toboolean(1)){
            luaL_doString(L, *it->action);
        }
    }
}
0 голосов
/ 22 сентября 2010

Вы не можете прерывать Lua, пока он работает.Лучшее, что вы можете сделать, это установить флаг, а затем обработать прерывание в безопасное время.Автономный интерпретатор использует эту технику для обработки пользовательских прерываний (control-C).Этот метод также используется в моей библиотеке lalarm , которая может использоваться для реализации обратных вызовов таймера, хотя и не на нужном высоком уровне.

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