-1

私は自分の C++ ゲーム エンジンに Lua スクリプト エンジンを実装しています。多くのシーン ノードがあり、それぞれに独自のスクリプトを割り当てることができます。その特定のスクリプトのすべてのフレームでlauL_dofile(...)を呼び出すことは実行可能なオプションですか、それともより良い方法がありますか? たとえば、既に解析されたスクリプトを保存する方法はありますか? luaL_loadfilelua_pcallを見ていました。最初のスクリプトでスクリプトをロードし、必要に応じて 2 番目のスクリプトで呼び出すと思っていましたが、lua_pcall はパラメーターとして一意の ID を持っていないようです。実行するスクリプトをどのように知る必要がありますか?

4

2 に答える 2

1

Lua API を使用する場合は、Lua スタックに慣れる必要があります。そして、学習できる最も重要なことの 1 つは、Lua API ドキュメントの読み方を理解することです。すべての関数について、それがスタックにどのように影響するか (スタックを変更する場合) について、右側に表記があります。

luaL_loadfileファイルをロードし、そのファイルを Lua 関数としてスタックにプッシュします。lua_pcallスタック上で関数を実行します。しかし、それがどのように機能するかについて、いくつかの注意点があります。

Lua を介して関数を呼び出す方法は、スタックに関しては単純です。呼び出したい関数をプッシュします。次に、最初から最後まで、すべての引数を順番にプッシュします。次に、その関数の呼び出しを発行します。lua_pcallこのように動作します。これは、実行する関数の位置が常に nargs + 1、スタックの一番上からの相対位置であることを意味します。ここで、nargsは関数に渡す引数の数です。

スタックから関数を(すべての引数と共に)ポップするlua_pcallことに注意してください。ファイルをロードしたばかりの場合、これがLua のその関数への唯一の参照になります。したがって、ファイルを再度実行することはできません。引数をスタックにプッシュする前に、 を使用して関数をコピーする必要があります。値が保持されるように、おそらくテーブルなどに貼り付ける必要があります。lua_pushvalueLUA_REGISTRYINDEX

于 2012-10-01T05:42:52.307 に答える
0

私がコメントしたように、通常はluaL_loadfile初期化時に呼び出します。ロードされたファイルは通常、Lua 関数としていくつかの [グローバル] 名を定義します (またはグローバル テーブルのいくつかのスロットを埋めます)。lua 5.2のドキュメントには、lua_callそれらの 1 つを呼び出す方法の例 (§4 ) が示されています。Lua スタックに適切なものをプッシュすることにより、アプリケーションの適切な場所でそのような呼び出し (おそらくlua_pcallまたはを使用) を行います。lua_call

于 2012-10-01T05:16:34.460 に答える