Bir yılan kuyruğunun kafayı takip etmesini nasıl sağlayabilirim?


10

Bir ödevi takiben ve küçük bir Yılan klonu oluşturarak libGDX ile çalışmaya başladıktan sonra, kısa bir süre içinde utanacağım bir sorunla karşılaştım.

Şu anda oyunun tuvalinde dolaşan bir yılanın kafasına (bu aşamada basit bir dikdörtgen) sahibim. Yılanın geri kalanını inşa etmenin en basit yolu, kafanın oyuncunun yaptıklarına göre boyutunu küçültecek bir Java Koleksiyonlar LinkedList of SnakeElements'e sahip olmasıydı.

Bununla birlikte, bu SnakeElements listesinin başı takip etmesi önemsiz değildi.

Bunu yapan mevcut işlev aşağıdaki gibidir ve kafa konumunu her güncellediğinde çağrılır:

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

maalesef bu davranışla sonuçlanır:

gif

Doğru çalışan bir yılan kuyruğu nasıl yapılır hakkında herhangi bir ipucu çok takdir edilecektir :)

Yanıtlar:


18

Sorunu şu şekilde düşünün:
Orijinal oyunda bir yılan nasıl hareket eder?
Yılan mevcut yönüne doğru hareket eder. Davranış, kafa hiçbir şeyden yok gibi görünüyor ve son kuyruk kısmı kayboluyor.

Yılan parçalarının bir listesi olabilir. Yapmak istediğiniz, listedeki son kuyruk parçasını temsil eden son öğeyi kaldırmaktır.
Ardından, konumlandırılması gereken yeni bir başlık oluşturmak ve listenin ilk konumuna koymak istiyorsunuz.
Bu, sadece ilk ve son pozisyonu değiştirdiğiniz için yılanın geri kalanının hareket etmediği anlamına gelir.
Bu yılan benzeri bir davranış yaratır.


Vay, teşekkürler! Bu çok mantıklı ve başlangıçtan itibaren fikir olmalıydı, eğlenceli bir yeniden düzenleme yapacağım gibi görünüyor :) Üzgünüm karma karım üzerimde seni rahatsız etmekten alıkoyuyor. Gelecekte olacağım söz veriyorum!
Kilian

1
Bunu düşünmenin alternatif bir yolu, her bir yılan elemanının, başını takip etmek yerine, doğrudan önündeki elemanı takip etmesidir. Bu, daha sonra yılanlar dokulu veya benzeri bir şey olduğunda faydalı olacaktır.
Nathan Reed

2
Bu arada mevcut sürüm, tekrar teşekkürler :) i.imgur.com/IaT5PNH.gif
Kilian

1

Gördüğüm yol, yılanın her parçasının önündeki parçayı takip ettiği "Caterpillar" benzeri bir sistem.

Başka bir deyişle, yılanın her bir parçası Pozisyonlu bir Nesne (x, y) , önünde hareket etmek için kullanacağı bölüme bir referans ve öndeki parçanın pozisyonunu işlemek için bir işlev ve buna göre hareket et. Ana yılan (Kafa), yılanın her parçası için referanslara sahip olmalı ve parçanın selefine uymasını sağlamaktan sorumlu işlevi çağıracak, ilk bölümün selefi olacaktı.
Umarım yardımcı olur!


Fikir buydu, ancak köşeleri idare etmek oldukça karmaşıktı. Ve bir oyuncu 180 derecelik keskin bir köşeyi dönerse ne olur? Bunu nasıl doğru bir şekilde ele alacağımızdan emin değildik ve Pontus Magnusson tarafından açıklanan yöntemi kullanmak tüm bu sorunları güzel bir şekilde çözüyor.
Kilian

Anlıyorum. Bir tırtıl sistemi uyguladığım tek zaman, parçaların boyutunda hücreler içeren bir ızgaram vardı, bu yüzden her bir parça her zaman belirli bir hücrenin içindeydi, bu şekilde sorun oluşmadı. Kötü ingilizcem için özür dilerim.
Lince Assassino

Ah evet, bu mantıklı ve aynı zamanda işe yaramalı, ama şu anda hatırlayamadığım bir nedenden dolayı bir ızgaraya sahip olma fikrini attık;) Teşekkürler :)
Kilian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.