我正在Yoyo Game Maker的一个游戏中工作,我有物品在传送带上移动。由于项目只朝一个方向移动,我认为使用队列或类似队列的数据结构来存储项目是最有意义的。但是,为了能够渲染项目,我需要能够在队列中的任何位置读取所有项目,而不仅仅是头部或尾部。
[[a] [b] [c] [d]]
|
V
a <- [[ ] [b] [c] [d]] <- e
|
V
[[b] [c] [d] [e]]
| | | |
V V V V
b c d e
我可以简单地使用一个数组,每个回合手动将其所有值向前移动一个槽(使用for循环),但不知何故,这似乎效率低,滞后,或者至少是坏形式。无论如何,我的编程本能在考虑使用这样一个系统时会退缩。
这是一个正确的假设吗?数组真的是实现这样结构的最佳方式吗?我是否应该担心效率,或者这种情况下的差异是否可以忽略不计?
非常感谢一些建议或示例(使用任何编程语言)。
答案 0 :(得分:1)
使用数组可能“看起来”效率低,但很可能不会。考虑到任何一次在传送带上实际有多少物品。如果您想快速随机访问数据结构中的任何索引,您必须使用数组,DS列表或DS网格(这里没有意义,很难)。
使用DS列表,您可以使用ds_list_delete(your_list, 0)
'出列',就像DS队列一样,并ds_list_insert(your_list, 0, value)
将'排队'项目。
迭代列表非常简单:
for ( var i = 0; i < ds_list_size( your_list ); i++ ) {
var item = your_list[|i];
}
在我正在研究的游戏中添加,使用组件构建对象也可能是相关的,这基本上意味着所有的敌人,玩家等都在他们的步骤中有一个for循环事件迭代并在需要时更新所有组件。在任何时候,我在游戏中最多有大约80个这样的对象,性能还没有成为问题。
您应该首先尝试获得工作解决方案,然后在特定于游戏的条件下对其进行测试:例如。如果您在结构中需要100个项目,请尝试这样做,如果性能不理想,则只进行优化。
答案 1 :(得分:-3)
我在游戏制作者中制作了一个类似要求的游戏。如果你知道青蛙游戏它有一些漂浮在河上的树林。
运动:为此,我创造了一些在特定方向上移动的木质物体。当青蛙与其中任何一个碰撞时,他/她开始向那个方向漂浮。另外,如果窗口向一个方向熄灭,我会将它放回窗口的另一侧。
Picking:我想要选择其中一个项目,您需要在每个对象中定义碰撞。碰撞后,您可以定义下一步。