12

C ++ / Luaゲームコードを整理する方法を分類し、それらの義務を分離するのを手伝ってください。最も便利な方法は何ですか、どれを使用しますか?

たとえば、Luaは、C ++オブジェクトの初期化のみ、またはゲームループの反復ごとに使用できます。ゲームロジックのみ、またはグラフィックスにも使用できます。一部のゲームエンジンは、スクリプトからすべてのサブシステムを完全に制御します。私はこのアプローチが本当に好きではありません(分離はまったくありません)。

すべてのゲームオブジェクト(npc、場所)をC ++オブジェクトなしのLuaテーブルとして実装するのは良い考えですか?または、それらをミラーリングする方が良いですか(C ++オブジェクトを制御するためのLuaテーブル)?または、他の何か?

ありがとうございました。

編集。私の分類:LuaとC ++:職務の分離

トピックの続き:Lua、ゲームの状態、ゲームのループ

4

3 に答える 3

4

私のアプローチは、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物理ベースのゲーム)でうまく機能することを私が見つけたものです。

于 2010-04-21T15:47:32.080 に答える
2

私はこの分類を提案します:

  1. 極端なバリエーション:Luaスクリプトはすべて(ゲームロジック、グラフィックス、AIなど)を制御します。さらに:スクリプトはホストプログラムとして機能し、ゲームループを所有します。一部のエンジンはそのようなことをします。Ba-adのこと:職務の分離やスクリプトの安全性はまったくありません。

  2. Luaスクリプトは、ゲームの状態を維持し、ゲームロジックを処理します。おそらく、スクリプトはゲームループの反復ごとに呼び出されます。

  3. Luaスクリプトは、初期化、構成、コールバックに使用されることはめったにありません。ホストプログラムは、スクリプトに非常に最小限のインターフェイスを提供(バインド)します。したがって、スクリプトは、そのように適切に設計され、提供されたブロックから構築されます。

于 2010-04-21T18:50:04.760 に答える
1

小さく始めます。マップ/レベル固有のスクリプトを実行できるように、ゲームエンティティへのアクセスを許可します。マップ/レベル間で一貫している動作は、おそらくスクリプトを必要としません。

また、オブジェクトのパブリックインターフェイスへのアクセスのみを許可します。

于 2010-04-21T15:07:06.243 に答える