Як можна змусити зміїний хвіст слідувати за головою?


10

Після виконання завдання та розпочаття роботи з libGDX , побудувавши невеликий клон Змії, я натрапив на проблему, за яку я, мабуть, соромлюся через деякий час.

У мене зараз голова змії (простий прямокутник на цьому етапі), що рухається навколо полотна гри. Найбільш прямим способом побудови решти змії було створення голови у власних Java Collection Collection LinkedList of SnakeElements, яка б збільшувала / зменшувала розміри відповідно до того, що робить гравець.

Якщо цей список 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

Подумайте про проблему так:
Як змія рухається в оригінальній грі?
Змія рухається до свого поточного напрямку. Поведінка виглядає так, що голова з'являється з нічого, а остання хвіст зникає.

Ви можете мати список змій. Що ви хочете зробити, це видалити останній елемент зі списку, який представляє останню хвостову частину.
Потім ви хочете створити нову заголовку, де вона повинна бути розміщена, і поставити її на перше місце у списку.
Це означає, що залишок змії не переміщується, оскільки ви змінюєте лише першу та останню позицію.
Це створює поведінку змії.


О, дякую! Це має багато сенсу, і це повинно було бути ідеєю з початку, схоже, я повеселюсь рефакторингу :) Мені просто шкода, що моя сумна кількість карми заважає мені звернутись до вас. Обіцяю, що повернусь у майбутньому!
Кіліан

1
Альтернативний спосіб задуматися над тим, що кожен елемент змії слід за елементом безпосередньо перед ним, а не за головою. Це стане в нагоді, якщо згодом змії текстуровані чи щось подібне.
Натан Рід

2
Ось поточна версія, до речі, ще раз дякую :) i.imgur.com/IaT5PNH.gif
Кіліан

1

Як я бачу, це як "гусенична" система, де кожна частина змії слідує за частиною, що передує їй.

Іншими словами, кожна частина змії була б Об'єктом з Положенням (х, у) , посиланням на ту частину, що передує їй, яку вона використовуватиме для переміщення навколо, і функцією для обробки положення частини, що передує її, і рухатися відповідно. Основна змія (Голова) повинна мати посилання на кожну частину змії і називатиме функцією, відповідальною за те, щоб частина слідувала за попередником, будучи Головою попередником першої частини.
Сподіваюся, це допомагає!


Це була ідея, але обробка кутів виявилася досить складною. А що буде, якщо гравець поверне гострий кут на 180 градусів? Ми не були впевнені, як правильно впоратися з цим, і використовуючи метод, описаний Понтус Магнуссон, добре вирішує ці проблеми.
Кіліан

Розумію. Єдиний раз, коли я впроваджував гусеничну систему, у мене з'явилася сітка з осередками розміром з частинами, тому кожна частина завжди була всередині однієї конкретної клітини, таким чином проблеми не виникало. Вибачте за мою погану англійську.
Lince Assassino

Ага так, це має сенс і має також працювати, але ми закинули ідею мати сітку з тієї причини, яку наразі не можу згадати;) Хоча дякую :)
Кіліан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.