2012-12-15 26 views
1

我想按名称,id(随机对象ID)或类型获取数据。
c#有字典。
但它应该是纯粹的c/C++ ...不像Sqlite或任何dotnet。使用C++进行游戏的动态数据处理

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结构是一个很好的设计吗? 它可以是墙壁,敌人,bullit或任何其他可以跨越多个x,y坐标。
我donnot想用一个向量,双端队列......因为它是不断变化的,几乎每一个帧...
如何保持这种日新月异的GameObjects集合....但它并不一定是双联...我想。
我的技术是像素精确的,而不是基于平铺或数学矢量。
我想实现...像...内部数据库的对象collission或其他东西。
1个对象即:可以查询并询问坐标是否被占用并避免循环阵列。
这让我忙了好一阵子

预先感谢您

+0

你说你想不通过收集循环查询,但在本质上,这只是一个查询是什么。该集合可能会以特定方式排序或分区,以便查询需要查看的项目少于线性搜索可能需要的项目,但仍然是搜索。 –

+0

也许我应该有一个与结构数组同步的“id”字符串数组,然后循环轻量级数组以迅速找到重物...我不知道那是我的问题 – NaturalDemon

回答

0

如果您计划基于坐标做查询,你可以索引基于这些数组,并使用分&征服,它排序它应该提供一个快速的排序和查找方法。

例如,如果您最多有1000x1000的坐标,则可以将该数字转换为单个整数,例如10001000. 64x33将转为640033.这有点粗糙,但它应该可以工作。只要你用D & C排序的数组很好随机化,你应该会收到良好的性能。

Ex。排序后的数组

 9720922 
    8500088 
     7770951 
5300033 
     450750 
    3500112 
     1200015 
      750099 

在这个例子中,如果你询问发生了什么事情与协调64x33,你会比较有640033然后5300033向3500112移动然后朝1200015 thne 750099.然后,你会知道有没有的任何进一步的条目,所以你可以在object_750099.lower中放置一个指向该对象的指针。

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

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

希望你明白我在说什么,因为我非常糟糕地解释它。

+0

的确的......我之前见过这个...我会试一试...然后回报 – NaturalDemon

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类型是这样的:

    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]
  • 哪里去?是阵列的墙壁类的名称现在

当你只需要穿墙阵列
穿墙走只在循环,如果你需要看到在世界国际周边区域的样子(TP,IX)[]
我认为这是更好,更快,那么一些类绑定/搜索/查询引擎。
由于GO类仅保存类特定数据,因此您还可以使用更少的内存(如果使用动态列表)。
对于通用的GO类,它包含所有类的所有数据,这些数据是内存浪费并且会减慢处理速度。

希望它可以帮助