뱀의 꼬리가 머리를 따라 가도록하려면 어떻게해야합니까?


10

과제를 수행 한 후 작은 뱀 복제본을 구축하여 libGDX 를 시작하면 잠시 후 부끄러운 문제가 발생합니다.

나는 현재 게임의 캔버스 주위를 움직이는 뱀의 머리 (이 단계에서 간단한 사각형)를 가지고 있습니다. 뱀의 나머지 부분을 만드는 가장 간단한 방법은 헤드에 플레이어가하는 것에 따라 크기가 증가 / 감소되는 SnakeElements의 Java Collections 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

다음과 같은 문제를 생각해보십시오
. 뱀은 원래 게임에서 어떻게 움직입니까?
뱀은 현재 방향으로 움직입니다. 동작은 머리가 아무것도없는 것처럼 보이고 마지막 꼬리 부분이 사라집니다.

snakeparts 목록을 가질 수 있습니다. 당신이하고 싶은 것은 마지막 꼬리 부분을 나타내는 목록의 마지막 항목을 제거하는 것입니다.
그런 다음 위치를 지정해야하는 새 헤드 파트를 작성하여 목록의 첫 번째 위치에 배치하려고합니다.
이것은 첫 번째 위치와 마지막 위치 만 변경하기 때문에 뱀의 나머지 부분은 움직이지 않음을 의미합니다.
이것은 뱀 같은 행동을 만듭니다.


우와, 고마워! 이것은 많은 의미가 있으며, 이제부터 아이디어가 있어야합니다. 재미있는 리팩토링을하는 것처럼 보입니다. 앞으로 다시 올게 약속드립니다!
Kilian

1
그것에 대해 생각하는 다른 방법은 각 뱀 요소가 머리를 따르는 것이 아니라 바로 앞 요소 만 따르는 것입니다. 나중에 뱀이 질감이 있거나 그와 비슷한 것이면 유용합니다.
Nathan Reed

2
그런데 현재 버전입니다. 다시 한번 감사드립니다 :) i.imgur.com/IaT5PNH.gif
Kilian

1

내가 보는 방식은 시스템과 같은 "캐터필러 (Caterpillar)"로 뱀의 각 부분이 그 앞 부분을 따른다.

다시 말해서, 뱀의 각 부분은 위치 (x, y)를 가진 객체이며 , 그 앞의 부분을 참조 하여 움직일 때 사용하고 그 부분의 위치를 ​​처리하는 기능입니다. 그에 따라 이동하십시오. 주 뱀 (두부)은 뱀의 모든 부분에 대한 참조를 가져야하며, 그 부분이 첫 번째 부분의 전임자 인 앞 부분을 따르도록하는 기능을 호출합니다.
그것이 도움이되기를 바랍니다!


이것은 아이디어이지만 핸들링 코너는 상당히 복잡했습니다. 그리고 플레이어가 180도 예리하게 회전하면 어떻게 될까요? 우리는 이것을 올바르게 처리하는 방법을 확신하지 못했으며 Pontus Magnusson이 설명한 방법을 사용하면 이러한 모든 문제를 훌륭하게 해결합니다.
Kilian

내가 참조. 유충 시스템을 구현할 때마다 부품 크기의 셀이있는 그리드가 있었기 때문에 각 부품은 항상 하나의 특정 셀 안에 있었으므로 문제가 발생하지 않았습니다. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.
Lince Assassino

아, 그렇습니다. 또한 이해해야합니다. 그러나 우리는 현재 기억할 수없는 이유로 그리드를 갖는 아이디어를 버렸습니다. 감사합니다 :)
Kilian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.