ヘビの尻尾を頭に追従させるにはどうすればよいですか?


10

割り当てに従って、小さなSnakeクローンを作成することでlibGDX使い始めたところ、おそらくしばらくの間恥ずかしい問題に遭遇しました。

現在、ヘビの頭(この段階では単純な長方形)がゲームのキャンバスの周りを移動しています。ヘビの残りの部分を構築する最も簡単な方法は、頭に、プレーヤーの動作に応じてサイズが増減するSnakeElementsのJavaコレクションLinkedListを所有させることでした。

SnakeElementsのこのリストを頭につけることは簡単ではありません。

これを行う現在の関数は次のとおりで、ヘッドがその位置を更新するたびに呼び出されます。

private void moveTail (float x, float y, int direction) {
    float tmpx, tmpy;
    int tmpdirection;
    int offset_x, offset_y;

    for (SnakeSegment snse : tail) {
        offset_x = 0;
        offset_y = 0;

        tmpx = snse.getX();
        tmpy = snse.getY();
        tmpdirection = snse.getDirection();

        switch(direction) {
            case 0:
                offset_x = 0;
                offset_y = -(2 + snse.width);
                break;
            case 1:
                offset_x = -(2 + snse.width);
                offset_y = 0;
                break;
            case 2:
                offset_x = 0;
                offset_y = (2 + snse.width);
                break;
            case 3:
                offset_x = (2 + snse.width);
                offset_y = 0;
                break;
            default:
                System.out.println("wrong direction");
        }

        snse.setX(x + offset_x);
        snse.setY(y + offset_y);
        snse.setDirection(direction);

        x = tmpx;
        y = tmpy;
        direction = tmpdirection;
    }
}

残念ながらこの動作になります:

gif

正しく機能するヘビの尾を作成する方法についてのヒントは大歓迎です:)

回答:


18

次のような問題について考えてみてください
。元のゲームで蛇はどのように動くのでしょうか。
ヘビは現在の方向に移動します。頭が何もないところから見え、最後の尾の部分が消えるように見えます。

あなたはスネークパーツのリストを持つことができます。あなたがしたいことは、最後の尾の部分を表すリストの最後の項目を削除することです。
次に、新しいヘッドパーツを配置する場所に作成し、リストの最初の位置に配置します。
つまり、最初と最後の位置を変更するだけなので、残りのヘビは移動しません。
これにより、ヘビのような動作が作成されます。


おっと、ありがとう!これは非常に理にかなっており、最初から考えていたはずですが、楽しいリファクタリングができるように見えます:)悲しいカルマの量が原因で私があなたを賛成できないのは残念です。私は将来戻ってくることを約束します!
キリアン2014年

1
それについて考える別の方法は、各蛇要素が頭をたどるのではなく、そのすぐ前の要素だけをたどることです。これは、後でヘビにテクスチャを付ける場合などに役立ちます。
ネイサンリード2014年

2
ちなみに、これは現在のバージョンです。ありがとうござい
Kilian

1

私がそれを見る方法は、ヘビの各部分がその前の部分に続く「キャタピラー」のようなシステムです。

別の言い方をすれば、蛇の各部分が持つオブジェクトであろう位置(x、y)は基準が動き回るために使用することが先にその一部へと前方その一部の位置を処理する機能とそれに応じて移動します。メインヘビ(ヘッド)は、ヘビのすべての部分への参照を持っている必要があり、その部分をその前任者に追従させる責任がある関数を呼び出し、最初の部分の前任者であるヘッドになります。
それが役に立てば幸い!


これはアイデアでしたが、コーナーの処理は非常に複雑であることがわかりました。そして、プレイヤーが180度の鋭い角を曲がるとどうなりますか?これを正しく処理する方法がわかりませんでした。PontusMagnussonによって説明されている方法を使用すると、これらの問題がすべてうまく解決されます。
キリアン

そうですか。キャタピラーシステムを実装した唯一のときは、パーツのサイズのセルを持つグリッドを持っていたため、各パーツは常に1つの特定のセル内にあり、この方法では問題は発生しませんでした。英語が下手でごめんなさい。
Lince Assassino 2014

ああ、それは理にかなっており、うまくいくはずですが、私は現在思い出せない理由でグリッドを使用するという考えを捨てました;)おかげで:)
Kilian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.