0

私はゲームプロジェクトのレイアウトを練っていて、「抽象ゲームの世界」を実装するためのいくつかの具体的なアイデアを思いついた。

このゲームの世界では、すべてがGameObject(ビークル、ユニット、パーティクルエフェクトなど)として表されます。実行時にオブジェクト間に依存関係が存在しないように、これらのオブジェクトを分離しておく必要があります。

これを実現するために、オブジェクトが他のオブジェクトのIDを要求して、メッセージを相互に送信できるようにします。メッセージは、そのIDでオブジェクトに配信されます。

私が取り組まなければならない問題は、他のオブジェクトからデータを要求するためのメソッドを持つことです。たとえば、車両に現在ドライバーがいるかどうか。これを行うためのいくつかの方法を検討しましたが、私が最も近いのは、送信者が他のオブジェクトに特別なメッセージを送信する特別な種類のメッセージです。受信オブジェクトは、要求されたデータをその中に配置することが期待されます。物体。

これは、オブジェクトがどのように機能するかを説明するために私が書いた「スタブ」です。

public class DataRequestMessage extends Message {
    public final RequestedDataType dataType;
    private boolean requestedDataReceived = false;
    private String stringValue;

    public DataRequestMessage(MessageType type, RequestedDataType dataType) {
        super(type);
        this.dataType = dataType;
    }

    public void setString(String value) {
        if(requestedDataReceived) {
            throw new RuntimeException("The content of the data request object has already been set");
        }
        if(dataType != RequestedDataType.String) {
            throw new RuntimeException("Data type object expects a value of type " + dataType + ", but received one of type String.");
        }
        requestedDataReceived = true;
        this.stringValue = value;
    }

    public String getString() {
        if(dataType != RequestedDataType.String) {
            throw new RuntimeException("This data type object has type " + dataType + ", and can therefore not return a String value.");
        }
        return stringValue;
    }
}

ご覧のとおり、オブジェクトが意図したとおりに使用されていない場合は、地雷原になります。ただし、オブジェクトが別のオブジェクトが何かを実行することを期待し、2つの間に依存関係を与えることを私はまだ心配しています。

このメソッドは、他のオブジェクトから任意のデータを要求するための良い方法ですか?または、提供されたオブジェクトに対して別の関数が操作を実行することを期待しているのは、常に悪い考えですか?

4

1 に答える 1

1

あなたに関連するかもしれないいくつかのメモ:

  • 実装しているのは、アクター モデルとして知られる確立された設計です。独自のシステムを展開する前に、少なくとも既存のシステムで何ができるかを検討することをお勧めします。

  • 基本的に、動的言語のように、Java の静的型安全性を放棄し、実行時にすべてのチェックを行っています。はい、デカップリングを実現しますが、必然的に実行時エラーが増えることを意味します。ただし、エラーを追跡して修正するのは簡単です。これが、人々が動的言語に背を向けない理由です。

  • データ型の検証をフレームワークの機能にすることをお勧めします (または、適切なものが見つかった場合は既存のもの)。その懸念を実際のメッセージパッシングから切り離してください。

これは、これらすべてを扱いやすくする別の JVM ベースの言語を学ぶ機会になるかもしれません。Scala には Actor モデルが実装されており、必要なボイラープレートは Java よりもはるかに少なくなります。もう 1 つの優れた選択肢は Clojure です。

于 2013-02-10T13:25:13.483 に答える