哦哦哦~~~,虽然一直没有什么进展。因为对于之前的设计一直不满意。
现给出我最新的想法:
修改的地方只有地图引用中的人物数据。
1> 就是在保存人物的地图格子中使用链表来完成。
2> 每个人物中都会保存它们链表中的每个格节的每个节点。
3> 当游戏对象创建的时候,则会在它内部生成对应大小的数据。
4> 当游戏对象移动的时候,则会在新的格子中把自已加入进去,删除原来的地方。
5> 当某个格子发生事件的时候,就可以直接找到相应的对象。
用说的很难表达,下面我还是用图片来解说吧:
0 1 2 3 4 5 1 2 3 4 游戏对象坐标(2,1)
我们的物就位于上面的蓝色框图中。
假设其中一个节点(2,1)中就有
1> NodeA1->NodeA2->NodeA3->NULL 类似这样的一个链表。(这里放三个只为说明情况,在真实环境中三个就代表了这个格子有三个对重叠在这里)
2> 在(3,1)中则可能会是这样:
NodeB1->NodeB2->NULL
1> 而在游戏对象中则可能有保存NodeA2,NodeB2这些节点。
2> 而格子中的节点数据其实也就是指向游戏对象的指针。
3> 当游戏对象从(2,1) 移动到(3,1)则相应的原先的(2,1)格子就会移除,NodeA2变为
NodeA1->NodeA3->NULL
6> 格子(3,1)不变,格子(4,1)则会添加相应的节点。这样就完成了一次移动操作。
我们格子中链表节点的添加都是直接从头部插入。
并不会改变各个其它节点的相对位置。
这使得我们的游戏对象可以直接保存相应的节点。而当某个格子中除去某个游戏对象,
也可以直接删除,而不用进行搜索。
另外说明一下,我现在的炸弹人中的对象大都是以8X8个格子的。所以每个游戏对象至少会有64个字节的地图格子数据。
这里再回顾一下先前的两次设计。
1> 第一次同这次是差不多,不过那时认为当游戏对象移动的时候删除相应格子的节点需要遍历相应的链表。效率上不容易接受(其实同一个格子重复的情况应该不会超过十个,所就算遍历也是还可以接受的)
2> 把链表改成当前重复的个数,而具体重复的是哪几个,则要再去找相关的表。虽然看上去这个方法比上个方法还麻烦。但主要是考虑到其它相关的事件没有对象移动这么频繁。
3> 当删除节点不再需要遍历,则这个方法是最好的罗,又简单,又直接。