Bagaimana saya bisa membuat ekor ular mengikuti kepala?


10

Mengikuti tugas dan baru saja memulai dengan libGDX dengan membangun klon Snake kecil saya telah mengalami masalah yang mungkin akan membuat saya malu dalam beberapa saat.

Saat ini saya memiliki kepala ular (persegi panjang sederhana pada tahap ini) yang bergerak di sekitar kanvas permainan. Cara paling mudah untuk membangun sisa ular adalah memiliki kepala yang memiliki Java Collections LinkedList dari SnakeElements yang akan menambah / mengurangi ukuran sesuai dengan apa yang dilakukan pemain.

Memiliki daftar SnakeElements mengikuti kepala namun telah terbukti tidak sepele.

Fungsi saat ini melakukan ini adalah sebagai berikut dan dipanggil setiap kali kepala memperbarui posisinya:

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;
    }
}

yang sayangnya menghasilkan perilaku ini:

gif

Setiap tips tentang cara membuat ekor ular yang bekerja dengan benar akan sangat dihargai :)

Jawaban:


18

Pikirkan masalah seperti ini:
Bagaimana ular bergerak di gim asli?
Ular itu bergerak ke arahnya saat ini. Perilaku itu terlihat seperti kepala muncul dari ketiadaan, dan bagian ekor terakhir menghilang.

Anda dapat memiliki daftar snakeparts. Yang ingin Anda lakukan adalah menghapus item terakhir dalam daftar yang mewakili bagian ekor terakhir.
Kemudian Anda ingin membuat headpart baru di mana ia harus diposisikan dan meletakkannya di posisi pertama daftar.
Ini berarti sisa ular tidak bergerak karena Anda hanya mengubah posisi pertama dan terakhir.
Ini menciptakan perilaku seperti ular.


Wah, terima kasih! Ini sangat masuk akal dan seharusnya menjadi ide sejak awal, sepertinya saya akan bersenang-senang refactoring :) Saya hanya minta maaf jumlah karma saya yang menyedihkan menghalangi saya untuk mengangkat Anda. Saya berjanji akan kembali lagi di masa depan!
Kilian

1
Cara alternatif untuk memikirkannya adalah bahwa setiap elemen ular hanya mengikuti elemen tepat di depannya, daripada mengikuti kepala. Ini akan berguna jika, nantinya, ular itu bertekstur atau semacamnya.
Nathan Reed


1

Cara saya melihatnya adalah sebagai sistem seperti "Caterpillar", di mana setiap bagian ular mengikuti bagian di depannya.

Dengan kata lain, setiap bagian dari ular akan menjadi Obyek dengan Posisi (x, y) , referensi ke bagian di depannya yang akan digunakan untuk bergerak dan fungsi untuk memproses posisi bagian di depan itu dan bergerak sesuai itu. Ular utama (Kepala) harus memiliki referensi untuk setiap bagian dari ular, dan akan memanggil fungsi yang bertanggung jawab untuk membuat bagian mengikuti pendahulunya, menjadi Kepala pendahulu bagian pertama.
Semoga ini bisa membantu!


Ini adalah idenya, tetapi menangani sudut ternyata cukup kompleks. Dan apa yang akan terjadi jika seorang pemain akan membelok tajam ke sudut 180 derajat? Kami tidak yakin bagaimana menangani ini dengan benar, dan menggunakan metode seperti yang dijelaskan oleh Pontus Magnusson menyelesaikan semua masalah ini dengan baik.
Kilian

Saya melihat. Satu-satunya saat saya menerapkan sistem ulat, saya memiliki grid dengan sel pada ukuran bagian, sehingga setiap bagian selalu di dalam satu sel tertentu, dengan cara ini, masalahnya tidak terjadi. Maaf untuk bahasa Inggris saya yang buruk.
Lince Assassino

Ah ya, itu masuk akal dan juga harus bekerja, tetapi kami membuang ide memiliki kotak karena alasan yang saat ini tidak dapat saya ingat;) Terima kasih :)
Kilian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.