使用Lua在C++中创建定时器。

我在想以下设置是否适用于小游戏:

假设我已将以下功能注册到 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); //将“timer”添加到向量或其他东西中
 返回1;
}

通过以下方式在 lua 中调用此函数:

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

然后我能这样做吗?

// 这个函数在游戏循环中被调用,它遍历向量中的所有计时器
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 状态引擎,然后它将调用 c++ 函数 getCondition(),然后查看它是否 =<5 并返回 true 或 false 吗?并且 luaL_doString(L, "setAction(7, 4, 6)"); 是否也同样适用?

此外,这是否是一种适合创建计时器的方法,只访问 lua 一次(用于创建计时器),然后让 c++ 处理其余部分,只通过 lua 调用 c++ 函数并让 lua 处理逻辑?

提前致谢。

原文链接 https://stackoverflow.com/questions/3765678

点赞
stackoverflow用户173806
stackoverflow用户173806

你可能希望将条件字符串更改为"return getCondition()<=5",否则字符串块将无法编译或运行。然后,在luaL_doString()成功返回时检查堆栈上的布尔返回值。像这样:

// 这个函数在游戏循环中被调用,循环遍历向量中的所有计时器
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);
        }
    }
}
2010-09-22 04:00:23
stackoverflow用户107090
stackoverflow用户107090

你不能在 Lua 运行时中断它。最好的方法是设置一个标志,然后在安全的时候处理中断。独立解释器使用这种技术来处理用户中断(control-C)。这种技术也被应用在我的 lalarm 库中,该库可以用于实现定时器回调,但不能达到您所需的高级别。

2010-09-22 16:40:09