2010-12-05 43 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。這工作很好,但我最終只有一個像素聚集在一起的所有部分(或如此)。這不是很有吸引力。

這不應該引起你描述的聚合。我們可以看到代碼嗎?也許你正在做一些事情,導致段落共享位置對象。這就是說,光滑的方法(假設它不會讓你的藝術搞砸,並且你可以一次移動一個段寬),就是將頭部移動到新的位置,然後移動尾巴到頭部的位置,將其重新插入到適當位置的列表中。