Cách tiếp cận rắn 360 độ


8

Gần đây tôi đã tham gia vào XNA và phải nói rằng tôi yêu nó. Như một trò chơi hello world, tôi quyết định tạo ra trò chơi kinh điển "Snake". Phiên bản 90 độ rất đơn giản và dễ thực hiện. Nhưng khi tôi cố gắng tạo ra một phiên bản của nó cho phép xoay 360 độ bằng cách sử dụng mũi tên trái và phải, tôi đã gặp phải một vấn đề.

Những gì tôi đang làm bây giờ bắt nguồn từ phiên bản 90 độ: Lặp lại qua từng bộ phận cơ thể rắn bắt đầu ở đuôi và kết thúc ngay trước đầu. Điều này hoạt động tuyệt vời khi di chuyển cứ sau 100 mili giây. Vấn đề với điều này là nó tạo ra một phong cách chơi trò chơi rắc rối vì về mặt kỹ thuật, trò chơi tiến triển chỉ với 6 khung hình / giây thay vì tiềm năng 60.

Tôi muốn di chuyển con rắn mỗi vòng lặp trò chơi. Nhưng thật không may bởi vì con rắn di chuyển với tốc độ kích thước đầu của nó, nó đi quá nhanh. Điều này có nghĩa là đầu sẽ cần di chuyển với mức tăng nhỏ hơn nhiều, chẳng hạn như (2, 2) theo hướng của nó chứ không phải là những gì tôi có bây giờ (32, 32). Bởi vì tôi đã làm việc với trò chơi này trong vài tuần khi quản lý trường học, tôi nghĩ rằng tôi đã suy nghĩ quá nhiều về cách thực hiện điều này. Đây có lẽ là một giải pháp đơn giản, tôi chỉ không nắm bắt được nó.

Đây là một số mã giả cho những gì tôi đã thử dựa trên những gì có ý nghĩa với tôi. Tôi thực sự không thể nghĩ ra một cách khác để làm điều đó.

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

Điều này tạo ra một cái gì đó như thế này: Code in Action . Như bạn có thể thấy mỗi phần luôn ở phía sau đầu và không tạo ra hiệu ứng "Đường mòn".

Một ví dụ hoàn hảo về những gì tôi sẽ tìm thấy ở đây: Data Worm . Không phải xoay vòng khung nhìn mà là hiệu ứng kéo dài của các hình tam giác.

Cảm ơn vì bất kì sự giúp đỡ!

Câu trả lời:


5

Với thuật toán đó, bạn đang làm cho mỗi phân đoạn phải đối mặt với cùng một góc với góc phía trước nó. Đó là lý do tại sao tất cả họ cuối cùng đứng ngay sau đầu, cuối cùng họ đều phải đối mặt với cùng một góc độ. Như bạn có thể thấy trong trò chơi Data Worm mà bạn đã liên kết, mỗi phân đoạn chỉ hướng về phía phân khúc phía trước nó . Xác định góc từ đoạn hiện tại đến đoạn đó nextvà có điểm phân đoạn theo cách đó thay vì đặt nó thành next.angle.

Để thực hiện điều đó, bạn có thể muốn thực sự lặp lại từ trước ra sau. Hành vi sẽ khác nhau dựa trên hướng bạn đi qua danh sách. Hãy thử cả hai và xem cái nào hoạt động tốt hơn.

Tôi đã từng sử dụng một ý tưởng tương tự cho một nguyên mẫu dự án trong quá khứ ( liên kết Unity WebPlayer ). Tôi đã sử dụng mã tương tự (mặc dù 3D) để khiến mỗi phân đoạn quay về phía phân khúc phía trước nó và giữ lại một khoảng cách đã đặt. Làm việc như người ở.


Thật tuyệt! Tôi đã đọc một blog sử dụng một khái niệm tương tự như vậy nhưng tôi không nghĩ đến việc lặp lại từ trước ra sau. Tôi sẽ thử và đánh dấu đây là câu trả lời nếu thành công.
Austin Brunkhorst

Cập nhật: Đã làm việc! Mất một thời gian để nắm bắt khái niệm và hiểu những gì đang thực sự xảy ra. Cảm ơn một lần nữa đã dẫn tôi đi đúng hướng! Đây là video về mã làm việc :) screenr.com/Fhn8 . Đừng bận tâm đến vụ va chạm thực phẩm, đã không dành nhiều thời gian cho nó.
Austin Brunkhorst

1
Rất vui vì tôi có thể giúp!
hỗn loạn Kỹ thuật viên

Liên kết của bạn đã chết.
Jeff

1
@Jeff Rõ ràng Dropbox đã quyết định tôi đang thu hút quá nhiều lưu lượng truy cập, điều này thật kỳ lạ ...
chaosTechnician 24/03/13
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.