3

背景

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


我想要的是

我注意到在我的开发过程中,很多事情可能都是“时间”。这样的事情可能包括显示信息,然后在 x 秒后将其删除,如果需要 x 秒,则以失败结束游戏,或者甚至用于每 x 秒使相机移动一定距离。我想wait在 Lua 中实现这个功能,而不是我的应用程序,但是在这一点上,我可以输入(因为我似乎无法让它工作)。


到目前为止我尝试过的

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

(我的 XNA 游戏对象在哪里Game


那么为什么我的想法行不通呢?

当前的问题是,即使我Game.Tick()每次都调用以保持一切正常,但我的应用程序的 XNA 部分停止接收输入。


所以,我的问题是,有没有更好的方法来做到这一点?在遇到用户输入问题之前,我认为它运行良好。你们中的任何人都实施了这样的运作良好的东西吗?

4

1 回答 1

3

您想要的是让您的游戏循环继续运行 - 但不要为对象调用“更新”(在 lua 脚本中)。如果您的每个对象都是不同的脚本,那么这相当简单。“Wait( time )”方法只会告诉您的游戏引擎“this”对象不想在time毫秒内更新。引擎将记录下来并继续为所有其他脚本(对象)调用更新和渲染。

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

当然 - 这在很大程度上取决于您的脚本如何与引擎的其余部分交互。如果所描述的解决方案不适合您,我会要求您更详细地描述您的脚本如何与引擎交互。

于 2012-07-31T19:35:20.677 回答