1

名前、ID (ランダムなオブジェクト ID)、またはタイプでデータを取得したいと考えています。
c# にはディクショナリがあります。
しかし、それは純粋な c/c++ でなければなりません... Sqlite や dotnet のようなものではありません。

  pSysBuffer = new D3DCOLOR[ winSizeX * winSizeY ]; // 3rd directx buffer
  // all my 2d stuf gets rendered here


  struct WorldInventory
    {
      Gameobject gameobject;
      // more properties
    } worldinventory[ winSizeX * winSizeY ];

    struct Gameobject
    {
       int[] x, y; 
       unsigned int id;
       Wall* wall;
       Enemy* enemy;
       Bullit bullit;
       Mine mine;
       // more properties
    } gameobject;

GameObject 構造体は適切な設計ですか? 壁、敵、ブリットなどのいずれかであり、複数の x、y 座標にまたがることができます。
ベクターやデキューを使いたくない...ほとんどすべてのフレームで変化するため...
常に変化するゲームオブジェクトのコレクションを保持する方法....しかし、二重にリンクする必要はありません...推測します。
私の手法はピクセル単位で正確であり、タイルや数学ベクトル ベースではありません。
私は達成したい...何かのような...オブジェクトの衝突やその他のもののための内部データベース。
1 つのオブジェクト ie: 座標が占有されているかどうかを照会して尋ねることができ、配列のループを回避できます。
これはかなり長い間私を忙しくしてい

ます、事前に感謝します

4

2 に答える 2

0

申し訳ありませんが、これはあなたの質問に対する直接的な回答ではありません

1.ゲームオブジェクト

  • すべての GO (ゲーム オブジェクト) タイプの列挙型リストを作成する

    enum _go_type_enum
     {
     _go_type_none=0,
     _go_type_wall,
     _go_type_mine,
     _go_type_tree,
     _go_type_hole,
     _go_type_roadNS,
     _go_type_roadWE,
     ...
     _go_type_enum_end
     };
    
  • すべてのGOタイプのクラス/構造体を作成します

  • 次のようなグリッド アイテム固有のデータを含めます (同じクラス アイテムが異なる値を持つことができます)。
  • ヒット ポイント、弾痕、血痕、爆発による酸化、回転可能なオブジェクトの向き...
  • world x,y を含めることを忘れないでください!!!

2.GO データストレージ

  • 次のように、すべての GO タイプの動的リストを作成します。

    List<GO_class1> go1;
    List<GO_class2> go2;
    List<GO_class3> go3;
    List<GO_class4> go4;
    ...
    
  • または代わりに静的配列を使用します(最大値が十分に大きい)

    //            array       used GOs
    GO_class1 go1[max]; int go1num=0;
    GO_class2 go2[max]; int go2num=0;
    GO_class3 go3[max]; int go3num=0;
    GO_class4 go4[max]; int go4num=0;
    ...
    
  • 世界地図を作る

    int world_tp[winSizeX*winSizeY]; // _go_type_enum
    int world_ix[winSizeX*winSizeY]; // index inside go?[];
    
  • 任意の GO は tp,ix として定義されます

  • たとえば、tp=_go_type_wall; ix=5; 行くって意味?[ix]
  • どこへ?壁クラスの配列の名前です

壁のみを通過する
必要がある場合、隣のエリアが wolrd(tp,ix)[] で見えるようにする必要がある場合は、壁の配列だけをループし
ます。これは、いくつかのクラスバインディング/検索/クエリエンジンよりもはるかに優れており、高速であると思います.
また、GO クラスはクラス固有のデータのみを保持するため、(動的リストを使用する場合) 使用するメモリが大幅に少なくなります。
ユニバーサル GO クラスの場合、すべてのクラスのすべてのデータが保持されるため、メモリが浪費され、処理が遅くなります。

それが役に立てば幸い

于 2014-01-15T09:36:02.267 に答える
0

座標に基づいてルックアップを行う場合は、それらに基づいて配列にインデックスを付け、divide&conquer を使用して並べ替えることができます。これにより、高速な並べ替えと検索方法が提供されます。

たとえば、最大 1000x1000 の座標がある場合、その数値を 10001000 のように 1 つの整数に変換できます。D&C でソートしている配列が適切にランダム化されている限り、良好なパフォーマンスが得られるはずです。

元。ソートされた配列の

        9720922
    8500088
        7770951
5300033
        450750
    3500112
        1200015
            750099

この例では、座標 64x33 で何が起こっているかを調べる場合、640033 と 5300033 を比較してから、3500112 に向かって移動し、750099 番目の 1200015 に向かって移動します。その後、それ以上のエントリがないことに気付くので、そこへのポインタを配置できます。 object_750099.lower のオブジェクト。

オブジェクト構造にはさらにいくつかの要素が必要です。

GameObject struct {
   ...
   int greater;
   int lower;
}

私が言いたいことを理解していただけると幸いです。

于 2012-12-16T11:32:07.037 に答える