C++ C+中游戏的动态数据处理+;

C++ C+中游戏的动态数据处理+;,c++,winapi,data-binding,2d,C++,Winapi,Data Binding,2d,我想按名称、id(随机对象id)或类型获取数据。c#has Dictionary。 但它应该是纯c/c++。。。不是像Sqlite或任何dotnet之类的东西 pSysBuffer = new D3DCOLOR[ winSizeX * winSizeY ]; // 3rd directx buffer // all my 2d stuf gets rendered here struct WorldInventory { Gameobject gameobje

我想按名称、id(随机对象id)或类型获取数据。
c#has Dictionary。
但它应该是纯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;
游戏对象结构设计好吗? 它可以是墙、敌人、布利特或任何东西,可以跨越多个x、y坐标。
我不想用向量,德克。。。因为它几乎每一帧都在变化。。。
如何保存不断变化的游戏对象集合。。。。但它不必是双重链接的。。。我喜欢喝啤酒。
我的技术是像素精确的,而不是基于平铺或数学矢量的。
我想实现。。。类似于。。。用于对象碰撞和/或其他事情的内部数据库。
1对象ie:可以查询并询问坐标是否被占用,避免数组循环。
这让我忙了好一阵子


提前感谢您

如果您计划基于坐标进行查找,您可以基于这些坐标对数组进行索引,并使用divide&conquer对其进行排序,这将提供一种快速排序和查找方法

例如,如果最大坐标为1000x1000,则可以将该数字转换为一个整数,如10001000。64x33将变成640033。这有点粗糙,但应该有用。只要使用D&C进行排序的数组是很好的随机化,您就应该获得良好的性能

排序数组的实例

        9720922
    8500088
        7770951
5300033
        450750
    3500112
        1200015
            750099
在本例中,如果您询问坐标64x33的情况,您将比较640033和5300033,然后向3500112移动,然后向1200015 thne 750099移动。然后您会意识到没有任何进一步的条目,所以您可以在object_750099.lower中放置指向该对象的指针

对象结构将需要更多的元素

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

希望你能理解我想说的,因为我解释得很糟糕。

很抱歉,这并不是对你问题的直接回答,因为
好吧,我想你考虑过这个了(一直为我工作):

1.游戏对象

  • 创建所有GO(游戏对象)类型的枚举列表

  • 为每个GO类型创建类/结构

  • 包括特定于网格项的数据(同一类项可以有不同的值),如:
  • 生命点,弹孔,血迹,爆炸氧化,旋转物体的方向
  • 不要忘了包括世界x,y
2.GO数据存储

  • 创建所有围棋类型的动态列表,如下所示:

    List<GO_class1> go1;
    List<GO_class2> go2;
    List<GO_class3> go3;
    List<GO_class4> go4;
    ...
    
  • 创建世界地图

    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]
  • 去哪里?是walls类的数组名称
现在,当您需要穿墙时,只需使用循环穿墙阵列
如果您需要查看邻近区域,请查看wolrd(tp,ix)[]
我认为这比某些类绑定/搜索/查询引擎更好更快。
此外,由于GO类只保存特定于类的数据,因此使用的内存(如果使用动态列表)也要少得多。
对于universal GO类,它保存所有类的所有数据,这会浪费内存,也会降低处理速度


希望它能有所帮助

您说您希望查询而不必在集合中循环,但本质上这就是查询。集合可能会以特定的方式进行排序或分区,以便查询需要查看的项目比线性搜索可能需要的项目少,但它仍然是一个搜索。也许我应该有一个与结构数组同步的“id”字符串数组,并循环轻量级数组以快速查找重对象。。。我不知道这是我的问题真的。。。我以前见过这个。。。我会试试看。。。然后回来报到
//            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?[];