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 object 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 类型创建类/结构

  • 包括特定于网格项目的数据(相同的类项目可以有不同的值),例如:
  • 生命值、弹孔、血迹、爆炸氧化、可转动物体的方向...
  • 并且不要忘记包括世界 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

如果您打算根据坐标进行查找,您可以根据这些索引数组并使用分治法对其进行排序,这应该提供快速的排序和查找方法。

例如,如果您最多有 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;
}

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

于 2012-12-16T11:32:07.037 回答