私のアプローチは、Luaにさらされるものを可能な限り制限することでした。シーンがレンダリングされるたびに(またはそれ以上)呼び出される「メイン」または他のそのような関数の必要性を私は見つけたことがありません。ただし、一部のLuaエンジン(LOVEなど)はこれを実行します。衝突、マウスクリック、ゲームワールドへの出入りなど、オブジェクトが応答する可能性のある一般的なイベントに対して、オプションのコールバック関数を使用してオブジェクトを定義することを好みます。
最終結果は非常に宣言的であり、ほとんどオブジェクトの構成ファイルです。オブジェクトのクラスやタイプを作成する機能と、これらのタイプに基づいてオブジェクトを作成する機能があります。オブジェクトには、さまざまなイベントに応答するときに呼び出すことができるメソッドのコレクションがあります。これらのLuaメソッドはすべてC/C ++メソッドにマップされ、C /C++メソッドがオブジェクトのプライベートプロパティを変更します。ボールオブジェクトをキャプチャできるバケットオブジェクトの例を次に示します。
define {
name='ball';
texture=png('images/orb.png');
model='active';
shape='circle';
radius=16;
mass=1.0;
elastic=.7;
friction=.4;
}
define {
name='bucket';
model='active';
mass=1;
shape='rect';
width=60;
height=52;
texture=png('images/bucket.png');
elastic=.5;
friction=.4;
oncontact = function(self, data)
if data.subject:type() == 'ball' then
local a = data.subject:angleTo(self:getxy())
if a < 130 and a > 50 then
--update score etc..
end
end
end;
}
私はこれをスクリプトAPIを実装するための「1つの真の方法」とは見なしません。Luaの美しさの1つは、さまざまなスタイルのAPIをサポートしていることです。これは、私が作成するゲーム(2D物理ベースのゲーム)でうまく機能することを私が見つけたものです。