Làm thế nào tôi có thể làm cho đuôi rắn theo đầu?


10

Sau một nhiệm vụ và chỉ bắt đầu với libGDX bằng cách xây dựng một bản sao Rắn nhỏ, tôi đã gặp phải một vấn đề mà có lẽ tôi sẽ cảm thấy xấu hổ trong một thời gian ngắn.

Tôi hiện đang có một đầu rắn (một hình chữ nhật đơn giản ở giai đoạn này) di chuyển xung quanh khung vẽ của trò chơi. Cách đơn giản nhất để xây dựng phần còn lại của con rắn là để người đứng đầu sở hữu một Bộ sưu tập Java LinkedList của SnakeElements sẽ giảm / giảm kích thước theo những gì người chơi làm.

Có danh sách SnakeElements này theo người đứng đầu tuy nhiên đã được chứng minh là không tầm thường.

Hàm hiện tại thực hiện việc này như sau và được gọi mỗi khi người đứng đầu cập nhật vị trí của nó:

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

không may dẫn đến hành vi này:

gif

Bất kỳ lời khuyên nào về cách làm cho đuôi rắn hoạt động chính xác sẽ được đánh giá cao :)

Câu trả lời:


18

Hãy nghĩ về vấn đề như thế này:
Làm thế nào một con rắn di chuyển trong trò chơi gốc?
Con rắn di chuyển về hướng hiện tại của nó. Hành vi trông giống như cái đầu xuất hiện từ hư vô, và phần đuôi cuối cùng biến mất.

Bạn có thể có một danh sách các con rắn. Những gì bạn muốn làm là loại bỏ mục cuối cùng trong danh sách đại diện cho phần đuôi cuối cùng.
Sau đó, bạn muốn tạo một headpart mới, nơi nó nên được định vị và đặt nó ở vị trí đầu tiên của danh sách.
Điều này có nghĩa là phần còn lại của con rắn không được di chuyển do bạn chỉ thay đổi vị trí đầu tiên và cuối cùng.
Điều này tạo ra một hành vi snakelike.


Whoa, cảm ơn! Điều này rất có ý nghĩa và nên là ý tưởng ngay từ đầu, có vẻ như tôi sẽ có một số tái cấu trúc thú vị :) Tôi chỉ xin lỗi vì số lượng nghiệp chướng đáng buồn của tôi đang ngăn cản tôi nâng đỡ bạn. Tôi hứa sẽ trở lại trong tương lai!
Kilian

1
Một cách khác để suy nghĩ về nó là mỗi phần tử rắn chỉ theo sau phần tử ngay trước nó, thay vì đi theo phần đầu. Điều này sẽ hữu ích nếu, sau này, những con rắn có kết cấu hoặc bất cứ thứ gì tương tự.
Nathan Reed

2
Nhân tiện, đây là phiên bản hiện tại, cảm ơn một lần nữa :) i.imgur.com/IaT5PNH.gif
Kilian

1

Cách tôi nhìn nhận nó giống như một "con sâu bướm" giống như hệ thống, nơi mỗi bộ phận của con rắn đi theo phần trước nó.

Nói cách khác, mỗi phần của con rắn sẽ là một Vật thể có Vị trí (x, y) , một tham chiếu đến phần phía trước mà nó sẽ sử dụng để di chuyển xung quanh và một chức năng để xử lý vị trí của phần phía trước nó và di chuyển phù hợp. Con rắn chính (Đầu) phải có tài liệu tham khảo cho mọi bộ phận của con rắn, và sẽ gọi chức năng chịu trách nhiệm làm cho bộ phận đó theo người tiền nhiệm của nó, là Đầu là tiền thân của phần đầu tiên.
Hy vọng nó giúp!


Đây là ý tưởng, nhưng việc xử lý các góc hóa ra khá phức tạp. Và chuyện gì sẽ xảy ra nếu một người chơi quay một góc 180 độ sắc nét? Chúng tôi không chắc chắn làm thế nào để xử lý vấn đề này một cách chính xác và sử dụng phương pháp như được mô tả bởi Pontus Magnusson giải quyết tất cả những vấn đề này một cách độc đáo.
Kilian

Tôi hiểu rồi. Lần duy nhất tôi thực hiện một hệ thống sâu bướm tôi đã có một lưới với các ô có kích thước của các bộ phận, vì vậy mỗi phần luôn nằm trong một ô cụ thể, theo cách này, vấn đề đã không xảy ra. Xin lỗi vì tiếng Anh của tôi không tốt.
Lince Assassino

À đúng, điều đó có ý nghĩa và cũng nên hoạt động, nhưng chúng tôi đã từ bỏ ý tưởng có lưới vì một lý do mà hiện tại tôi không thể nhớ được;) Cảm ơn mặc dù :)
Kilian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.