3

Luaスクリプトを使用したC++ゲームのデザイン/スケルトンコーディングフェーズにいますが、デザインの問題が発生しました。

ゲームには同じ種類のエンティティのコピーが多数あり、動作は同じスクリプトによって制御されます。単一のlua_state内の同じタイプのエンティティ間でスクリプトを共有できる簡単な方法はありますか?私はこの質問がインターネット上で数回尋ねられたのを見つけることができました。同じスクリプトを異なるlua_stateにロードするのが良いかどうかについての混合フィードバックを読みましたが、代替案についての詳細なフィードバックではありません。

シンプルで防弾ですが、同じエンティティタイプの各インスタンスが作成された同じバイトコードの追加コピーをロード、コンパイル、および保存することは悲劇的な無駄だと思うので、よりスマートなソリューションを見つけたいと思います。

これらは私が考えた2つの解決策です。私はプログラミングやCまたはOOの概念に慣れていませんが、Lua、特にLua /CAPIに関してはまだ学んでいます。私のアイデアは健全だと思いますが、どうやってそれらを実装するのかさえわかりません。

  1. LuaスクリプトにOOを実装し、各エンティティをLuaオブジェクトで表すようにします。すべてのLuaロジックがオブジェクトに作用します。これには、単一のエンティティによって地球環境を変更できるという利点(または「利点」)もあります。

  2. setfenvを使用して各エンティティを独自の環境にカプセル化し、グローバル空間からすべての関数の参照をコピーします。私が理解しているように、envはデフォルトのグローバルとは異なるテーブルですが、setfenvを調べましたが、それをどのように行うかわかりません。

4

1 に答える 1

4

1と2は、多かれ少なかれ、同じコインの異なる面です。それは単にオブジェクトがどこに行くかという問題です。タイプ1では、オブジェクトはLuaスクリプトの明示的な部分です。これは、スクリプトがオブジェクトの設定方法を決定することを意味します。

タイプ2では、オブジェクトは環境です。それはまだLuaテーブルですが、外部コードによって作成されたものです。スクリプトは、外部コードで許可されている方法を除いて、このオブジェクトの制限から抜け出すことはできません。

タイプ1を実装する最も簡単な方法は、Luabindを使用することです。私は、Luaが派生できるC++クラスとしてAIオブジェクトを持っているでしょう。そのAIの「メインスクリプト」を実行すると、そのクラスのインスタンスが作成されます。制御するエンティティの名前、制御に使用できる参照など、スクリプトパラメータを渡します。

タイプ2はかなり単純です。まず、空のテーブルを作成し、ユーザーがアクセスできるようにするグローバル変数をテーブルに入力して、新しい環境を作成します。これらは、ゲームの状態との会話(シーン内の他のオブジェクトの検索など)、問題のエンティティを移動する方法などに使用されます。これらの値を効果的に不変で一定にするためにプレイできるメタテーブルのトリックがあるため、ユーザーは後でそれらを変更できません。

次に、lua_loadstringまたはを使用してスクリプトをロードしますlua_loadfile。これにより、そのLuaスクリプトを表す関数がLuaスタックに配置されます。次に、このテーブルをそのスクリプト関数の環境としてに適用しますlua_setfenv。次に、そのスクリプトを実行して、必要な変数(エンティティの名前など)を渡します。

于 2011-11-04T01:42:28.183 に答える