3

バックグラウンド

現在、 Lua スクリプトでアプリケーションを制御できるように、LuaInterfaceを利用する XNA アプリケーションを作成しています。


私が欲しいもの

私の開発では、多くのことがおそらく「時間」に基づいていることに気付きました。そのようなものには、情報を表示してから 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 部分が入力の受信を停止することです。


だから、私の質問は、これを行うためのより良い方法はありますか? ユーザー入力で問題が発生するまでは、かなりうまく機能していると思いました。うまく機能するこのようなものを実装した人はいますか?

4

1 に答える 1

3

必要なのは、ゲーム ループの実行を継続することですが、オブジェクトの "Update" (lua スクリプト内) を呼び出さないことです。各オブジェクトが異なるスクリプトである場合、これは非常に簡単です。「Wait( time )」メソッドは、「この」オブジェクトがtimeミリ秒の間更新されたくないことをゲーム エンジンに通知するだけです。エンジンはダウンしたことを認識し、他のすべてのスクリプト (オブジェクト) に対して Update と Render を呼び出し続けます。

次に「待機中」のオブジェクトを更新/レンダリングするときは、「更新」呼び出しをスキップし、代わりにレンダリングのみを呼び出します。タイムアウトになると、オブジェクトの Update の呼び出しを再開できます。可能であれば、中断した次の行から Update メソッドの実行を再開できます。これにより、C# の "async" メソッドのように、スクリプトを簡単に記述できます。

もちろん、これはスクリプトがエンジンの残りの部分とどのように相互作用するかに大きく依存します。説明されている解決策がうまくいかない場合は、スクリプトがエンジンとどのようにやり取りするかを詳しく説明してください。

于 2012-07-31T19:35:20.677 に答える