Làm cách nào để giữ nhân vật của tôi tập trung vào màn hình?


8

Tôi đang làm một trò chơi tương tự như Legend of Zelda: Link to the Past (phiêu lưu hành động 2D từ trên xuống). Tôi muốn nhân vật ở giữa màn hình khi anh ta di chuyển.

Hiện tại, bất cứ khi nào người chơi muốn di chuyển, tôi di chuyển tất cả bản đồ theo hướng ngược lại. Điều này hoạt động, nhưng khi tôi thêm nhiều đối tượng vào thế giới, việc di chuyển tất cả chúng trở nên phức tạp hơn.

Có cách nào tốt hơn để tiếp cận điều này?


19
Tạo một máy ảnh và di chuyển đó. Về cơ bản, mọi thứ sẽ được vẽ với phần bù dựa trên vị trí camera. Di chuyển vũ trụ để di chuyển nhân vật của bạn là một giáo sư Farnsworth hơi quá đáng.
MichaelHouse

1
+1 để tham khảo tài liệu tham khảo Futurama của anh ấy: P
Doorknob

@ Byte56 Cảm ơn, nó gần với những gì tôi đang làm, vì vậy tôi có thể giữ nó như vậy. Nhưng điều đó rất có ý nghĩa. Bạn muốn đặt nó trong một câu trả lời để tôi có thể chấp nhận nó?
asbumste

Bạn đang sử dụng hệ thống con nào?
bobobobo

Câu trả lời:


8

Cách xử lý điển hình này là tạo một đối tượng camera. Hình thức đơn giản nhất của máy ảnh chỉ là một vị trí. Máy ảnh đơn giản này xác định "trung tâm" của chế độ xem hiện tại. Vì vậy, bạn không sửa đổi tất cả các vị trí của ô / thực thể của mình, bạn chỉ cần trừ tọa độ camera khỏi các vị trí khi vẽ. Trong tình huống này, máy ảnh không "di chuyển".

Mặc dù máy ảnh và nhân vật của bạn sẽ chia sẻ một vị trí hầu hết thời gian, bạn vẫn có thể muốn có chúng dưới dạng các giá trị riêng biệt, ví dụ, bạn có thể ngăn máy ảnh di chuyển khi đến tận cùng thế giới, nhưng cho phép người chơi tiếp tục di chuyển.

Một máy ảnh tiên tiến hơn một chút không di chuyển. Tất cả các thực thể và gạch được vẽ mà không có bù và vị trí mà bạn đang hiển thị thay đổi. Điều này rất giống với máy ảnh cơ bản nhất và bạn vẫn có thể thực hiện nhiều tối ưu hóa giống nhau để hiển thị có chọn lọc (chỉ gọi drawnhững gì máy ảnh có thể nhìn thấy), trên cả hai. Về cơ bản, đó chỉ là một cách nghĩ khác về nó.


Xin chào Byte, tôi đã thực hiện những gì bạn nói với thành công ... Tôi nghĩ vậy. Nhưng bây giờ tôi đang gặp vấn đề ... bạn có thể giúp xem không? Một anh chàng nói tôi thực sự không cần bất kỳ cam variables... và đưa ra một phương pháp thay thế ... stackoverflow.com/questions/18199373/
mẹo

Tôi sẽ xem xét nó sau, bây giờ tôi đề nghị bạn hỏi về nó trong trò chuyện .
MichaelHouse

3

Không, đây là cách sai lầm để đi về điều này.

Làm thế nào bạn sẽ làm phát hiện bẫy? Thế còn khi người chơi chạm đến các cạnh của bức tường? Hệ thống xem của bạn sẽ hoạt động cho ngục tối hay bạn sẽ phải viết lại một phần đáng kể của mã?

Thế giới là hình học. Người chơi là hình học. Thế giới không chuyển động. Người chơi làm. Đặt vị trí của máy ảnh thành chính giữa trên trình phát. Luôn luôn . Và đó là tất cả để có nó.

Đừng thử và trở nên lạ mắt với "oh nếu tôi trượt thế giới, thì nó sẽ mang lại diện mạo cho người chơi đang di chuyển". Bạn sẽ làm phức tạp toán học với các hệ tọa độ kỳ lạ vào cuối ngày.

Đúng là kết xuất của OpenGL thực sự hoạt động bằng cách "sửa máy ảnh để chỉ xuống - z, và biến đổi và xoay tất cả hình học thế giới để phù hợp với âm lượng chế độ xem chính tắc", nhưng bạn không có ý nghĩ về điều đó khi lập trình . gluLookAtcó các thông số được đặt tên eye, lookupvì một lý do - vì vậy bạn có thể nghĩ về một hệ toạ độ hợp lý.


Một trong những sai lầm lớn nhất mà tôi mắc phải với hệ thống UI GL mà tôi đang phát triển là cố gắng làm việc theo tọa độ chính tắc ([-1,1]) "để làm cho nó đơn giản hơn". Tất cả các đối tượng màn hình có tọa độ trong [-1,1]. Đây là một sai lầm rất lớn , tôi đã liên tục cố gắng suy nghĩ trong phạm vi [-1,1] này, chuyển đổi giữa các pixel và NDC, chuyển đổi trở lại. Khi tôi từ bỏ ý tưởng làm việc trong NDC này và chỉ làm việc bằng pixel và chuyển đổi thành NDC ngay trước khi kết xuất như bạn nghĩ , có một thế giới khác biệt về cách dễ dàng nghĩ về các yếu tố định vị trên màn hình, xử lý các sự kiện đầu vào, v.v.
bobobobo
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.