2010-12-05 46 views
2

我想创建一个蛇游戏,其中的蛇的运动不是基于网格但自由形式,我有麻烦找出如何获得尾部段跟着头。蛇游戏以下部分(非基于网格)

最简单的解决方案是从尾部循环到头部,并将当前位置设置为下一个段的位置,即:segment[i].position = segment[i - 1].position。这工作很好,但我最终只有一个像素聚集在一起的所有部分(或如此)。这不是很有吸引力。

为了努力克服这一点,我创建了最后15个位置的数组,并将最新的位置推到最后。然后每一帧我弹出数组中的第一个元素并使用它,给出了该段在15帧前的位置的一个snapshot。这种方式非常完美,但是通过不断调用new()并对数组进行混洗,表现真的很糟糕。闪存垃圾收集器给了我地狱。

任何人都可以想到其他解决方案?

我正在研究Flash,但我不认为解决方案真的基于任何语言。

谢谢!

回答

1

A deque往往是这些东西被实现的方式,但如果一个不可用,那么在数组中实现的ring buffer可以作为替代,如果队列大小有一个上限。

+0

我认为他只需要一个队列而不是一个双向队列,因为他只需要添加到一端并从另一端删除。环形缓冲区的实现听起来像是如果“将数组混在一起”真的是瓶颈的话。 – 2010-12-05 05:04:30

+0

@Laurence:我发现deque的实现往往比队列实现更优化,因为后者的很多依赖于数组混排。 – 2010-12-05 05:07:40

0

最简单的解决方法是从尾到头循环,并将当前位置设置为下一个段的位置,即:segment [i] .position = segment [i-1] .position。这工作很好,但我最终只有一个像素聚集在一起的所有部分(或如此)。这不是很有吸引力。

这不应该引起你描述的聚合。我们可以看到代码吗?也许你正在做一些事情,导致段落共享位置对象。这就是说,光滑的方法(假设它不会让你的艺术搞砸,并且你可以一次移动一个段宽),就是将头部移动到新的位置,然后移动尾巴到头部的位置,将其重新插入到适当位置的列表中。