在继续响应用户输入和渲染帧的同时,等待 x 秒钟后继续。

背景

我目前正在创建一个 XNA 应用程序,利用 LuaInterface,以便我可以用 Lua 脚本 来控制应用程序。


我想要什么

我注意到,在我的开发中,很多东西可能是“时间”为基础的。这些东西可能包括“显示信息,然后在 x 秒后移除它”,“如果需要 x 秒就结束一场失败的游戏”,甚至在“每 x 秒中缓和相机一定的距离”中使用。我想在 Lua 中实现 wait 函数,而不是在我的应用程序中进行实现,但在这一点上,我很乐意听取意见(因为我似乎无法让它正常工作)。


到目前为止我尝试了什么

inv.lua

 _G.Wait=(function(t)
    local dest=Time.ElapsedMilliseconds+t*1000
    while Time.ElapsedMilliseconds<dest do
        gel:UIUpdate()
    end
    return true
 end)

 --Aliases
 _G.wait=Wait

gELua.vb

Public Sub UIUpdate()
    Application.DoEvents()
    Game.Tick()
End Sub

(其中 Game 是我的 XNA 游戏对象)


因此,为什么我的想法不起作用呢?

当前的问题是,即使我每次都调用 Game.Tick() 来让所有东西都正常运行,但我的应用程序的 XNA 部分仍然停止接收输入。


所以,我的问题是,是否有更好的方法来实现这一点?我认为它运作得相当不错,直到遇到用户输入方面的问题。你们中有没有人实现过类似的东西,并且工作得很好呢?

点赞
用户802203
用户802203

您希望游戏循环继续运行,但不要调用某个对象内部的“Update”(它在一个 Lua 脚本中)。如果每个对象都是不同的脚本,那么这就很简单了。一个“Wait( time)”方法只会告诉游戏引擎,“这”个对象不希望在 time 毫秒内更新。引擎将记录下来,并继续为所有其他脚本(对象)调用 Update 和 Render。

下次更新 / 渲染“等待”对象时,它将跳过“Update”调用,仅调用 Render。当超时到期时,您可以恢复调用对象上的 Update。如果可能 - 您可以从您暂停的下一行恢复执行 Update 方法。这将使编写脚本变得简单,就像 C# 的“async”方法一样。

当然 - 这严重取决于您的脚本如何与引擎交互。如果上述解决方案不适用于您,我请求您详细描述您的脚本与引擎的交互方式。

2012-07-31 19:35:20