首页 > 解决方案 > 从 C 访问 Lua 协程

问题描述

我已经实现了一个协同程序系统。当我按 ENTER 清除第一个文本框时,它会调用 contscript() 进而调用 lua_resume() 但它不会继续协同程序。

那么我应该传递什么给 lua_resume() 以使协程继续?

static lua_State *lua;

static int luapanic(lua_State *L)
{
        allegro_exit();
        const char *err = lua_tostring(L, -1);
        DEBUGF("lua panic: %s\n", err);
        printf("lua panic: %s\n", err);
        return 0;
}

static int textbox(lua_State *L)
{
        const char *str = luaL_checkstring(L, 1);

        message(str);
        return 1;
}

void contscript(void)
{
        lua_resume(lua,NULL,0);
}

static int transfer_player(lua_State *L)
{
        int x, y;
        SpriteObj *p;

        x = luaL_checkint(L, 1);
        y = luaL_checkint(L, 2);

        p = findobject(0);
        setposition(p,x,y);
        scrollToAndCentre(x,y);
        return 1;
}

bool initscript(void)
{
        lua = luaL_newstate();
        lua_atpanic(lua, luapanic);

        luaL_openlibs(lua);
        lua_register(lua, "textbox", textbox);
        lua_register(lua, "transfer_player", transfer_player);
        return true;
}

这是有问题的脚本:

local co = coroutine.wrap(
        function()
                textbox("Dear me! I never knew birds could sing so\nbeautifully!")
                coroutine.yield()
                textbox("Text message #2")
        end
)

co()

标签: luacoroutinelua-api

解决方案


推荐阅读