是否可以从宿主程序执行单个lua语句?

Lak*_*ake 5 java lua luaj

我正在尝试将基于lua的脚本系统嵌入到我的游戏引擎中.我希望脚本能够同时具有阻塞和非阻塞命令,例如:

character.walkTo(24, 359);  // Blocks until character arrives
c = 35; // Non blocking, execution goes on to the next statement
Run Code Online (Sandbox Code Playgroud)

由于"walkTo"需要"活动"超过1帧执行,我希望能够从Java主机而不是整个函数运行1个语句.这是因为拥有真正的多线程是不合适的,这是不需要的.

如果我只执行1个语句,并保持执行状态"暂停"直到下一个语句执行,我将能够通过检查命令是否在主机中完成来实现阻塞命令,如"walkTo",如果是,则去到下一个语句,否则,等到下一帧迭代.

有没有办法从带有LuaJ的Java主机(或任何其他Lua api)执行1个语句,或者我被迫使用lex和yacc开发自己的脚本引擎?

欢迎任何好主意,谢谢!

use*_*367 3

看来您缺少异步模式。如果c=35必须执行一次character(24,359)那么正确的方法是将function() c=35 end第三个参数传递给walk方法,并且您的引擎(执行实际的“行走”)将在适当的时候调用该回调。

character.walkTo(24, 359, function ()
    c = 35
end)
Run Code Online (Sandbox Code Playgroud)

否则,walk可以安排步行到发动机并立即让路,在正确的事件上恢复。在这种情况下,您必须设置脚本工作协程(您不能在主状态下屈服)。

script = coroutine.wrap(function ()
    character.walkTo(24, 359) -- will yield and leave callable global 'script'
    c = 35
end)
script() -- resume first time
-- here script is over

...

-- this wrapper may be implemented in Lua or host language

function character.walkTo(x, y)
    engine.startActualWalkingTo(x, y)
    coroutine.yield() -- yields to host
    -- coroutine.resume() will continue here
end

...

-- somewhere in engine code (pseudo-code here)

for event in eventLoop do
    if character.x == endPoint.x and character.y == endPoint.y then
        script() -- resume again at c=35
    end
end
Run Code Online (Sandbox Code Playgroud)

您可以随时使用 取消脚本script=nil

Yield() 有一些限制,请参阅手册。