【问题标题】:Creating Timers in C++ using Lua使用 Lua 在 C++ 中创建计时器
【发布时间】:2010-09-22 01:20:24
【问题描述】:

我想知道以下设置是否适用于小型游戏:

假设我在 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=

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

提前致谢。

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    您可能希望将条件字符串更改为"return getCondition()&lt;=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);
            }
        }
    }
    

    【讨论】:

    • 好的,但是这种设置在全球范围内是否可以正常工作,或者是否有更好/更快的方法让 lua 在 C++ 中创建计时器,或者这种设置会很好吗?其次, *it->condition 实际上是否适用于向量(如果我没有弄错,只有 *it->first *it->second 会起作用?如果确实如此,那么存储的最佳结构是什么? 的数据?我最初的反应是创建一个结构并简单地用这些结构填充一个向量,但这感觉不对:S
    【解决方案2】:

    你不能在 Lua 运行时打断它。您可以做的最好的事情是设置一个标志,然后在安全的时间处理中断。独立解释器使用这种技术来处理用户中断(control-C)。我的lalarm 库中也使用了这种技术,它可用于实现计时器回调,但不是您想要的高级别的。

    【讨论】:

    • 回答其他问题?不要以为我暗示了我想打断 Lua 的任何地方,不过还是谢谢 :)
    • 从你对计时器的使用中我假设是这样的。
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2021-05-09
    • 2015-01-10
    • 2017-10-30
    • 2021-02-25
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多