Triển khai camera / khung nhìn cho trò chơi 2D


20

Cách thiết thực nhất để triển khai camera / khung nhìn cho trò chơi 2D là gì?

Tôi đã đọc, rằng tôi nên lưu trữ vị trí thế giới đối tượng thay vì vị trí liên quan đến màn hình?

Tình hình hiện tại:

Tôi đã triển khai một trò chơi 2D đơn giản trong đó tôi tải các đối tượng và cấp độ từ các tệp XML. Hiện tại tệp XML cấp trông như thế này:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

Tất cả các đối tượng có "vị trí" vector 2d lưu trữ vị trí hiện tại của chúng trên màn hình.

Những gì tôi muốn nó là:

Minh họa Viewport / gamewworld

Trong hình:

  • Máy ảnh có kích thước 800x600 hoặc 640x480
  • Khối và họa tiết là 16x16 pixel.
  • Kích thước thế giới có thể thay đổi
  • Các tọa độ có lẽ nên được chuẩn hóa so với thế giới, không phải với màn hình?
  • Vị trí khung nhìn tương ứng với x, y của người chơi và di chuyển khi người chơi đến vùng chết của máy ảnh (tương tự video này ).

Tôi đang hỏi các ví dụ / bài viết giả, nhưng nếu bạn cần biết những gì tôi đang sử dụng cho sự phát triển: SDL & C / C ++.


1
Thêm liên kết thứ ba của bạn trong các ý kiến ​​ở đây và tôi có thể thêm nó vào câu hỏi của bạn.
MichaelHouse

Đây là những gì tôi muốn nói với vùng chết của máy ảnh: youtube.com/watch?v=89TRXUm8jMI
bluekirai


Xin chào @Arthur Wulf White, quan tâm đến công phu? Cảm ơn.
bluekirai

Máy ảnh bạn đề cập là phiên bản cụ thể của máy ảnh 2d thông thường chỉ được sử dụng để bù đắp cho chế độ xem (không quay và thu phóng). Hành vi theo dõi có thể được thực hiện bằng cách kiểm tra khoảng cách giữa nhân vật người chơi và máy ảnh, di chuyển máy ảnh nếu khoảng cách quá lớn.
sói

Câu trả lời:


19

Bạn cần phải có mọi đối tượng được định vị so với thế giới thay vì màn hình. Máy ảnh của bạn cũng nên có tọa độ thế giới riêng để có thể vẽ ở vị trí tương đối trên thế giới. Cũng có thể thuận tiện khi máy ảnh của bạn theo dõi một đối tượng, vì vậy dù đối tượng ở đâu, máy ảnh chỉ cần sử dụng tọa độ của nó. Thông thường tọa độ của máy ảnh sẽ đặt nó từ góc trên bên trái. Điều này có nghĩa là máy ảnh sẽ có vị trí thế giới xấp xỉ (0,24) trong ảnh .

Đối với việc thực sự vẽ các đối tượng mà máy ảnh có thể "nhìn thấy", bạn phải vẽ tất cả các đối tượng liên quan đến tọa độ thế giới của máy ảnh. Để tính toán vị trí màn hình của đối tượng so với máy ảnh, chỉ cần thực hiện:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

Rõ ràng một số đối tượng không thực sự hiển thị với máy ảnh, vì vậy bạn có thể muốn thực hiện một hệ thống loại bỏ chế độ xem.


2

Tốt nhất là thực hiện tất cả những điều này trong GPU bằng cách sử dụng ma trận Thế giới và Xem, không phải bằng cách sửa đổi nơi bạn vẽ các đối tượng trên CPU.

Bằng cách đó, bạn có thể thay đổi máy ảnh một cách tùy ý (thậm chí phóng to và thu nhỏ!) Và nó sẽ hoạt động một cách kỳ diệu. Bạn vẫn có thể xem loại bỏ cũng như để tiết kiệm thời gian rút thăm. Và không có mã nào để vẽ thế giới của bạn sẽ phải thay đổi sau khi bạn thiết lập chế độ xem và ma trận thế giới một cách chính xác.

Trong SDL, có lẽ bạn chỉ có thể gọi các cuộc gọi OpenGL nội tuyến như glOrthoglTranslate .

Xem chủ đề này .


Ai đó có thể giải thích downvote? Điều này thật ý nghĩa.
Xin chào thế giới

1
Tôi đã không bỏ phiếu, nhưng tôi nghĩ đó là vì điều này thậm chí không trả lời câu hỏi. Câu hỏi là về cách tính toán một cái gì đó, không phải là nó hiệu quả hơn hay dễ thực hiện hơn trên GPU so với CPU. OP thậm chí còn nói rằng anh ta đang tìm kiếm các ví dụ giả. Không có nghi ngờ rằng việc sử dụng kết hợp ma trận máy ảnh / thế giới / mô hình sẽ hiệu quả hơn, vì vậy mklingen có một điểm ít nhất.
Dan Watkins

Câu trả lời này không tệ chút nào! Cụ thể hơn về phát triển OpenGL / DX, nhưng cách tiếp cận phù hợp vì bạn chỉ có thể tính toán ma trận dịch dựa trên các máy ảnh và di chuyển các đối tượng qua ma trận cam, mà không thay đổi vị trí thực tế của chúng.
nenchev
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.