3

私は Pacman ゲームを動作させていますが、そのゲームに戻ってコードをより適切に「整理」しようとしています。以前は、基本的にゲーム内のすべてのオブジェクト (パックマン、ゴースト、マップなど) を参照する game1.cs のオブジェクトを参照するこの "TopObject" がありました。ゴースト オブジェクトから Pacman オブジェクトにアクセスしたり、ゴースト オブジェクトからマップ/タイル オブジェクトにアクセスしたり、どこからでも ContentMananger にアクセスしてコンテンツをロードしたりできるように、どこからでもグローバルに利用できるようにしました。

私はこれが悪い習慣であることを知っているので、私はそれを排除しようとしています. たとえば、「ContentManager」タイプを取るすべてのオブジェクトに LoadContent() メソッドを作成したため、TopObject を使用して ContentManager を呼び出す必要がなくなりました。

さらに先に進むと、すべてのオブジェクトへのこのグローバル参照なしで何かをするのに本当に苦労しています。例: - 私の Pacman Update(). 内から..

  • 壁にぶつかるかどうかを知る必要があります。マップ/タイルへの参照が必要です。

  • ゴーストと衝突したかどうかを知る必要があるため、ゴースト オブジェクトへの参照が必要です。

  • 食べ物と衝突したかどうかを知り、スコアボードを更新する必要があるため、スコアボード オブジェクトへの参照が必要です。

本質的に、すべてのオブジェクトに非常に多くのオブジェクト参照を渡すことで、巨大な混乱を引き起こしているように感じます。

これをよりうまく整理する方法を知っている人はいますか? Pacman Update() 内の衝突をチェックする必要がありますか、それとも別の "PacmanObject.CheckCollisionWith()" を作成して Game1 Update() から呼び出す必要がありますか? 衝突ロジックも新しいクラスに分離する必要がありますか?

ありがとう!

4

1 に答える 1

1

オブジェクトへの参照を含む中心点を持つこと自体は悪いことではありません。ただし、適切な設計では、各オブジェクトに最も関連するアクションを正しいクラスに配置します。たとえば、プレイヤーはタイルや壁を参照する必要はありません。Move メソッドを実行している間、プレーヤーは、次の移動が有効な場合に true/false を返す Map クラスの静的メソッドを呼び出すことができます。このように、プレイヤーはマップ自体への参照を持ちません。

public class Player
{
    public void Update()
    {
        //stuff to find nextTile position

        //Call static function toward a class that contains the map data.
        if (Map.TileIsWalkable(nextTile))
            Move();
    }
}

public class Map
{
    public static Map loadedMap; // Handling it as singleton, normally you only load one map at a time.

    public static bool TileIsWalkable(Vector2 position)
    {
        if (loadedMap == null) // Throw assert, shouldn't happen.

        return //whatever test needed in loadedMap structure
    }
}

ゴーストへの参照を保持するゴースト マネージャを使用することもできます。プレイヤーは、すべてのゴーストをループして衝突するかどうかを確認するメソッドをマネージャーで呼び出すだけで済みます。さらに良いことに、そのメソッドは参照ではなく位置を取ることができます。そうすれば、ゴースト同士が衝突するかどうかを確認するために再利用できます。(ランダムなアイデア)

何かをする方法はたくさんあります。コード設計で最も難しいのは、より意味があり、後で更新および変更するのが最も簡単な場所に要素を配置することです。

于 2012-10-20T18:23:36.247 に答える