Language agnostic 蛇形游戏以下部分(非网格)

Language agnostic 蛇形游戏以下部分(非网格),language-agnostic,Language Agnostic,我正在尝试创建一个蛇游戏,其中蛇的运动不是基于网格的,而是自由形式的,我很难弄清楚如何让尾随部分跟随头部 最简单的解决方案是从尾部到头部循环,并将当前段的位置设置为下一段的位置,即:segment[i]。position=segment[i-1]。position。这非常有效,但我最终得到的结果是,所有的片段仅相隔一个像素(大约)。它不是很吸引人 为了克服这一点,我为最后15个位置创建了一个数组,并将最新的位置推到最后。然后每一帧我从数组中弹出第一个元素并使用它,给我一个15帧前片段所在位置的快

我正在尝试创建一个蛇游戏,其中蛇的运动不是基于网格的,而是自由形式的,我很难弄清楚如何让尾随部分跟随头部

最简单的解决方案是从尾部到头部循环,并将当前段的位置设置为下一段的位置,即:
segment[i]。position=segment[i-1]。position
。这非常有效,但我最终得到的结果是,所有的片段仅相隔一个像素(大约)。它不是很吸引人

为了克服这一点,我为最后15个位置创建了一个数组,并将最新的位置推到最后。然后每一帧我从数组中弹出第一个元素并使用它,给我一个15帧前片段所在位置的快照。这工作得很好,但不断调用
new()
并对数组进行洗牌,确实会拖累性能。闪存垃圾收集器让我受不了

有人能想出其他解决办法吗

我正在开发Flash,但我不认为解决方案真正基于任何语言

谢谢

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

最简单的解决方案是从尾部到头部循环,并将当前段的位置设置为下一段的位置,即:段[i]。位置=段[i-1]。位置。这非常有效,但我最终得到的结果是,所有的片段仅相隔一个像素(大约)。它不是很吸引人

这不应该导致你描述的聚集。我们能看看密码吗?也许你正在做的事情会导致线段共享位置对象


也就是说,巧妙的方法(假设它不会把你的艺术搞砸,并且你可以一次移动一段宽度)是将头部移动到它的新位置,然后将尾部移动到头部所在的位置,将其重新插入列表中的适当位置。

我想他只需要一个队列,而不是一个队列,因为他只需要在一端添加,从另一端删除。如果“无序排列数组”真的是瓶颈,那么环形缓冲区实现听起来确实是一种可行的方法。@Laurence:我发现deque实现在这方面比队列实现更优化,因为后者中有很多依赖于数组无序排列。我想我需要这个环形缓冲区。Wikipedia页面上说:“循环缓冲对于具有固定最大大小的队列来说是一个很好的实现策略”,并且我将始终拥有最后15个位置。这是我所做的,但是向后的。我把尾巴移到头部所在的位置,然后移动头部。运动不是很剧烈,比如说1或2个像素,这就是导致聚束的原因。@Scott:双缓冲可能会有帮助。啊,我明白了。在这种情况下,请单独移动每个段。