2010-12-05 11 views
2

スネークの動きがグリッドベースではなくフリーフォームで、後続のセグメントをどのように取得するかという問題を抱えているスネークゲームを作成しようとしています。頭に従ってください。スネークゲーム(グリッドベースではない)

最も簡単な解決策は、テールからヘッドにループして、電流の位置を次のセグメントの位置、つまりsegment[i].position = segment[i - 1].positionに設定することです。これは素晴らしいですが、すべてのセグメントが1ピクセルだけ離れて集まってしまいます。それほど魅力的ではありません。

これを打ち破るために、私は最後の15ポジションの配列を作成し、最新のポジションを最後までプッシュします。それから、フレームごとに、配列の最初の要素がポップアップされ、それを使って、snapshotのセグメントが15フレーム前の位置にあります。これは完璧に機能しますが、常にnew()と呼び出して配列をシャッフルすることで、パフォーマンスが大幅に低下します。フラッシュのガベージコレクターは私に地獄を与えています。

誰も他の解決策を考えることはできますか?

私はFlash上​​で作業していますが、解決策は実際にはどの言語にも基づいているとは思いません。

ありがとうございます!

答えて

1

dequeはこれらの方法が実装されている傾向がありますが、利用できない場合は、配列に実装されたring bufferがキューサイズに上限がある場合は代替として機能します。

+0

私は彼がキューを必要としていると思うでしょう。両端キューにキューを追加するだけで、キューからキューを削除する必要があるからです。リングバッファーの実装は、 "配列をシャッフルする"ことが本当にボトルネックであるかどうかのように聞こえる。 –

+0

@Laurence:後者の多くは配列シャッフルに依存しているので、deque実装はこれに対してキュー実装よりも最適化されている傾向にあることがわかりました。 –

+0

私はこのリングバッファが私が必要とするものだと思います。 Wikipediaのページによれば、「循環バッファリングは最大サイズが固定されたキューの実装方法を改善します」と私は常に最後の15のポジションを持っています。 – Scott

0

最も簡単な解決策は、テールからヘッドにループして、電流の位置を次のセグメントの位置、つまりセグメント[i] .position = segment [i-1] .positionに設定することです。これは素晴らしいですが、すべてのセグメントが1ピクセルだけ離れて集まってしまいます。それほど魅力的ではありません。

これは、あなたが記述した束縛を引き起こすべきではありません。コードを見ることができますか?たぶんあなたは、セグメントの位置オブジェクトを共有する何かをしているかもしれません。

つまり、滑らかなアプローチ(あなたのアートで物事を混乱させず、一度に1つのセグメント幅を移動できると仮定します)は、ヘッドを新しい位置に移動し、頭がどこにあったかを適切な位置にリストに再挿入します。

+0

それは私がやることですが、後ろ向きです。私は頭がある場所に尾を動かし、頭を動かします。動きはそれほど劇的ではありませんが、1ピクセルまたは2ピクセルと言われています。 – Scott

+0

@Scott:ダブルバッファリングが役立つかもしれません。 –

+0

ああ、そうです。その場合、** do **はすべてのセグメントを個別に移動します。 –

関連する問題