1

私はメインループのあるゲームを持っています-各ループで、ゲーム内のすべてのNPCを呼び出します-> ProcessAI()でアクションを実行します。これはサーバーであるため、ProcessAIの呼び出しは、クライアントゲームのようにすべてのフレームで実行されるわけではありません。また、シングルスレッドです。

今、私はluabindを使用してluaでC ++コードベースを拡張したいと思いました(多分、ブーストオーバーヘッドがあっても)。だから私は私のNPCクラスのいくつかの関数をLUAに公開します。

たとえば、アクタースクリプト(より洗練された動作をするボスバトル)を作成したかったのですが、c ++ ProcessAI関数でイベントが発生するたびに、これを特定のNPCの対応するluaスクリプトに委任します。

私はboss.luaスクリプトで次のようなものを想像しました

 function OnEngageCombat(NPC)
 NPC:say ("Some taunts...")
 ScheduleEvent(CastEvilSpell,/*time*/2000,/*numExecutions*/1,)
 end

 function CastEvilSpell(NPC)
 NPC:CastSpell("someSpell")
 end

ただし、これを行う方法がわかりません。ScheduleEventはLuaにエクスポートされたC ++関数である必要がありますが、これを使用してNPC(ボス)のオブジェクト参照を保持し、そのスクリプトで関数を呼び出すための最良のアプローチは何でしょうか。約2秒後?

さらに、この遅延実行(NPCが相互に対話できるようにしたい)とともに、私の現在のアイデアは、特別なNPCごとにアクター動作スクリプトを用意することです。

今私が想像したのは、2人のNPC間の会話を開始することです。

function DoGossip(NPC)
// check if NPC1 is close to NPC2
if NPC:DistanceToNpc("SomeGuy") < 10 then
 StartConversation1()
end

function StartConversation1(NPC)
NPC:Say("Hello ...")
// wait a moment now trigger NPC2 to reply
????
end

基本的に-NPC2の動作スクリプトであるluascriptBに存在するluascriptAから関数を呼び出すにはどうすればよいですか。良いデザインは何でしょうか?

ありがとう

4

1 に答える 1

1

LuaBind を使用すると、スクリプトに公開するゲーム エンジンのラッパー クラスを参照する、グローバルなスクリプト可能オブジェクトを設定できます。

そのため、Lua エンジンをセットアップするときはいつでも、C++ コードで次のように、すべてのスクリプトがアクセスできるようにするグローバルを登録できます。

luabind::globals(m_pLuaState)["Game"] = m_pGameWrapperClass;

次に、スクリプト内で Game オブジェクトを参照するだけで、次のようにゲーム固有の機能を取得できます。

Game:ScheduleEvent(...)

C++ ゲーム ラッパー クラスは、LuaBind でバインドする ScheduleEvent 関数を実装するだけです。そのオブジェクトで必要な数のゲーム固有の関数を追加/登録できます。

質問 2 に進むには、FindNPC() という名前の Game クラスに関数を登録するだけです。この関数は、文字列引数または ID、またはエンジンで npc を検索し、それへの参照を返す何かを受け取ります。Game クラスと同じように npc-y 機能を公開する npc オブジェクトの周りにラッパー クラスを書きたいと思うでしょう。FindNPC() は NPC を表すユーザーデータを返し、必要な機能を公開します。それを使用するか、ゲーム自体で何かを行うようにします。

于 2012-06-10T17:35:07.917 に答える