360度のヘビに近づく方法


8

私は最近XNAに入って、大好きだと言わざるを得ません。Hello Worldゲームの一種として、クラシックゲーム「Snake」を作成することにしました。90度バージョンは、非常にシンプルで実装が簡単でした。しかし、左矢印と右矢印を使用して360度回転できるバージョンを作成しようとすると、ある種の問題が発生しました。

私が今やっていることは、90度バージョンに由来します。尾から始まり、頭の直前で終わる各蛇の体の部分を反復します。これは、100ミリ秒ごとに移動するときにうまく機能します。この問題は、技術的には60 fpsではなく6 fpsでゲームが進行するため、途切れ途切れのスタイルのゲームプレイになることです。

ゲームループごとにヘビを移動したいと思います。しかし、残念なことに、ヘビは頭のサイズの速度で動くため、速度が速すぎます。これは、頭が現在の方向(32、32)ではなく、その方向に(2、2)などのはるかに小さい増分で移動する必要があることを意味します。私は学校を管理している間、このゲームに数週間取り組んできたので、これを達成する方法を考えすぎていたと思います。それはおそらく簡単な解決策です、私はそれを捕まえていません。

これは、私が理解できることに基づいて、私が試したもののいくつかの疑似コードです。それを行う別の方法を本当に考えることはできません。

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

これにより、次のようなコードが生成さます。ご覧のとおり、各パーツは常に頭の後ろにあり、「トレイル」効果はありません。

ここで私が何をしようとしているのかを示す完璧な例は、データワームです。ビューポートの回転ではなく、三角形のトレーリング効果。

助けてくれてありがとう!

回答:


5

そのアルゴリズムを使用して、各セグメントをその前のセグメントと同じ角度に向けます。だからこそ、彼らはすべて頭の真後ろに行き着き、最終的にはすべて同じ角度を向いているのです。リンクしたデータワームゲームで確認できるように、各セグメントはその前のセグメントの方を向いています。現在のセグメントからそのセグメントまでの角度を決定し、nextに設定する代わりに、そのようにセグメントポイントを設定しnext.angleます。

その実装では、代わりに実際に前から後ろに反復したい場合があります。リストを通過する方向によって動作が異なります。両方を試してみて、どちらが効果的かを確認してください。

私は過去にプロジェクトプロトタイプに同様のアイデアを使用しました(Unity WebPlayerリンク)。同様の(3Dとはいえ)コードを使用して、各セグメントをその前のセグメントに向け、設定された距離に戻します。魅力のように働いた。


それは素晴らしいことです!私はそれに似たコンセプトを使用しているブログを読んでいましたが、最初から最後まで繰り返すことを考えていませんでした。試してみて、成功した場合は回答としてマークします。
オースティンBrunkhorst

更新:うまくいきました!概念を理解し、実際に何が起こっているのかを理解するのに少し時間をかけました。私を正しい方向に導いてくれてありがとう!これが動作するコードのビデオです:) screenr.com/Fhn8。食べ物の衝突を気にしないでください、それにあまり時間を費やしていません。
オースティンBrunkhorst

1
お役に立てて嬉しいです!
chaosTechnician 2012年

あなたのリンクは死んでいます。
ジェフ

1
@JeffどうやらDropboxは私が何とかしてあまりにも多くのトラフィックを引き込んでいると判断しました、それは奇妙です...
chaosTechnician
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.