1

私は単純なコンポーネントベースのc++およびluaゲームエンジンに取り組んできました。現在、オーディオや物理学などのすべてのサブシステムは、を使用して独自のモジュールを使用してluaから呼び出すことができますluaL_newlib

私が抱えている問題は、luaスクリプトが関数を呼び出してエンティティを変更する方法です。LikeSetPosition()は、静的関数ではなく、エンティティのインスタンスで呼び出す必要があることは明らかです。それで、これらのインスタンス化された関数を持つことができる方法があります。

私が持っていたアイデアの1つは、各エンティティが固有のモジュール名で関数を登録することでした。したがって、とのようにentity1.Setpositionなりentity2.Setpositionます。このような機能を効果的に複製して登録することは可能でしょうか?

または、このようなインスタンス化された関数を使用して、コンポーネントがその一部であるエンティティを変更できるようにする別の方法はありますか?

私が自分自身をひどく説明した場合は、私が喜んでより多くの情報を提供するように言ってください

4

1 に答える 1

3

Luaには「インスタンスメソッド」の構文糖衣があります。次のように、ドットの代わりにコロンを使用して関数を呼び出す場合:

entity1:SetPosition(...)

次に、Luaはそれを次のように書き直します。

entity1.SetPosition(entity, ...)

つまり、メソッドが呼び出されているオブジェクトである暗黙の最初の引数を追加します。C側では、追加の引数が表示されます。これは、インスタンスメソッドを作成するための推奨される方法です。


他の2つの注目すべき点:上記の書き直しは正確には何が起こるかではありません。あなたがこのようなことをするなら:

SomeFunctionReturningEntity():SetPosition(...)

に書き換えません

SomeFunctionReturningEntity().SetPosition(SomeFunctionReturningEntity(), ...)

ご想像のとおり、実際には関数を1回だけ呼び出します。

また、CからではなくLua自体からインスタンスメソッドを記述している場合は、次のように宣言するための構文糖衣があります。

function entity1:SetPosition(...)
end

これは次と同等です。

function entity1.SetPosition(self, ...)
end

つまり、暗黙の最初の引数を関数に追加し、それを呼び出しますself

(ちなみに、これもこれと同等です:

entity1.SetPosition = function(self, ...)
end

技術的には、テーブル内で関数を宣言することでさえ、構文糖衣です。)

于 2012-09-08T17:08:41.170 に答える