0

まず、こんにちは、これが私の初めてです。私は若いコーダー(15)であり、今回はゲームをさらに整理しながら、ゲーム(実際には、再利用可能なゲームエンジンとフレームワーク全体、呼び出し方法がわからない、多分GDK?)を作成する2回目の試みです。

重要な注意:私はXNAフレームワークを使用しているため、ゲームエンジンは純粋に低レベルのDirectX管理ではありません。事前定義されたクラスでXNAを拡張しようとしています。これにより、どのゲームにも簡単に挿入して、後で管理できるようになります。

エンティティをWorldManagerのリストに入れ、後で直接変更するためにエンティティを取得して、リストに戻す方法を見つけるのに行き詰まりました(したがって、Updateメソッドで使用されます)。

私のアイデア(および質問)は次のとおりです。

  1. 考えられる最善の解決策は、エンティティをリストにリンクさせることです。これにより、唯一のエンティティオブジェクトを更新すると、リスト内でも更新されます。残念ながら、私はそれを行う方法がわかりません、そしてこれは最良の答えかもしれません。

  2. また、最初に作成したエンティティを編集してから、findを使用してリストで検索して更新することも考えました。問題は、findメソッドがどのように検索するかわからないことです。何か変更を加えると、メソッドがまったく新しい別のオブジェクトであると見なすことができるとしたらどうでしょうか。(findは実際にどのように検索しますか?)

  3. 私が行ったのは、IDをリストに追加した瞬間にエンティティに追加して、編集後に元の場所に戻すことができるようにすることでした。問題は、removeメソッドもあることです。インデックスを変更する場合は、エンティティを削除するたびにIDを再更新する必要があるため、インデックスが変更されるかどうかはわかりません。それは非常に非効率的だと思います。では、List <>。Removeはインデックスを変更しますか?(私はそうなると思います)

これらは実際には1つに3つの質問があり、これらのいずれかに答えていただければ幸いです。もちろん、一番上の質問への回答はもっと高く評価されます。

すべてがどのように機能するかを理解するためのコード:

public class WorldManager
{
    List<Entity> Entities = new List<Entity>();
    List<Entity> ToAdd_Entities = new List<Entity>();
    List<Entity> ToRemove_Entities = new List<Entity>();
...
    public void Update()
    {
        for(int count = 0; count < ToAdd_Entities.Count; count++)
        {
            Entities.Add(ToAdd_Entities[count]);
            int index = Entities.IndexOf(ToAdd_Entities[count]);
            Entities[index].ID = index;

            ToAdd_Entities.Remove(ToAdd_Entities[count]);
        }

        for (int count = 0; count < ToRemove_Entities.Count; count++)
        {
            Entities.Remove(ToRemove_Entities[count]);
            ToAdd_Entities.Remove(ToAdd_Entities[count]);

            //index update is required here too, I just didn't implement it yet.
        }
    ...
   }
}

どのようにアクセスしますか:

List<Entity> bots = WorldManager.GetEntitiesByName("bot");
bots[1].Location = new Vector2(x,y);
WorldManager.UpdateEntities(bots);

私はそのコードを使用しません。これは私の考えの単なる例です。

私の紛らわしい英語を許してください(あなたがそれを紛らわしいと思うなら)、私はセルビア人です。

前もって感謝します。

4

2 に答える 2

1

「すべてのオブジェクトが含まれる 1 つの大きなリスト」アプローチを使用しないことをお勧めします。エンジンの入力、グラフィックス、その他の基本的な要素に集中し、残りはゲーム固有のクラスに任せます。

多くの木がある 2D ワールドがあると想像してください。それらはすべてほとんど静的です。エンティティ リストに 5,000 個のエンティティがあり、まったく何もしていません。そこに置くのではなく、Map クラスのどこかにあるリストに配置する必要があります。このようにして、アクセスしやすくなります (それらを見つけるにはリスト全体を調べる必要があります)そしてデザインもずっときれいになります. このように、ジェネリック ハンドラー コードのクラス全体をコーディングする必要はありません。最終的には、ワールドにスローできる可能性のあるすべてのオブジェクトに適合するわけではありません。

したがって、私の側からの 3 つのヒントは次のとおりです。 - ゲーム固有ではないコードのみをエンジン (グラフィックス、サウンド、入力) に配置します。残りのケア - 最後になりましたが、ゲームのコンポーネントを別のコンポーネントから分離しておき、本当に必要な場所でのみ相互作用させます。

また重要なのは、いくつかのゲームをビルドしてから、それらが実際に共有しているコードを調べ、このコードからエンジンを形成することです。

これがどのように行われるかの例が必要な場合は (完全であるとは限りませんが)、私の小さなエンジンをここで見ることができます。これは Java であり、あまり良いコメントではありませんが、エンジンを構築する方法についての基本的なアイデアを提供するはずです。私がこのエンジンで作成したゲームを見たい場合は、ダウンロード セクションをご覧ください。

于 2010-01-16T15:33:00.747 に答える
0

さて、私は私の最上位のソリューションに答えを持っています! 私の別の質問からそれを得て、ここにも解決策を配置する必要があると考えました。

答えは、リストに追加している限り、エンティティはクラスであり、そのオブジェクトは「参照型」であるため、すでにリンクされているため、それらを他のオブジェクト、またはこの場合はリストに割り当てると、それらはそれにリンクしています。そのオブジェクトに加えた変更は、反対側で自動的に更新されます!

(私が間違っている場合は誰かが私を訂正してください。フレームワーク/エンジンをテストするようになったらすぐにこれをチェックし、これが「その」ソリューションであることをお知らせします。)

于 2010-01-16T22:10:38.593 に答える