Mô hình phổ biến để chia tỷ lệ các đơn vị thực tế trực tuyến


10

Đây là một câu hỏi tiếp theo cho câu hỏi khác .

Tôi muốn biết nếu có một mô hình chung / điển hình / tốt nhất để chia tỷ lệ đại diện của tôi về thế giới (hiện tại là 160Kmx160Km) để phù hợp với khu vực vẽ (hiện tại là 800x600 pixel).

Tôi có thể nghĩ về ít nhất bốn cách tiếp cận khác nhau:

Naïve one (cách tôi đã làm cho đến nay). Tôi đã triển khai một hàm toàn cục sc(vector), đơn giản sẽ trả về một bản sao thu nhỏ của vectơ được truyền vào. Tất nhiên điều này hoạt động, nhưng bắt buộc tôi phải viết mã như:

drawCircle(sc(radius), sc(position))

Chức năng gói . Tôi có thể định nghĩa một số hàm, mỗi hàm bao bọc một phần mềm trung gian ban đầu. Ví dụ tôi có thể định nghĩamyDrawCircle rằng trước tiên sẽ chia tỷ lệ các đối số cần chia tỷ lệ, sau đó gọi drawCirclevới đối số sau. Điều này sẽ làm cho mã của tôi có thể dễ đọc hơn và dễ bảo trì hơn, nhưng tôi nên viết rất nhiều hàm gói, nghe có vẻ ngớ ngẩn.

Chức năng trang trí . Tôi chỉ đơn giản là có thể trang trí các chức năng trung gian hiện có, cung cấp rộng tự động cho tất cả các thông số mà là một instantiation của lớp Vector3D, nhưng vấn đề là những chức năng cũng làm việc với các thông số tương tự là listhay Vector2Dquá, và trang trí sẽ không có cách nào để biết danh sách nào cần được thu nhỏ (ví dụ bán kính) và danh sách nào không (giá trị RGB).

Khởi tạo bề mặt . Khi xác định bề mặt tôi sẽ vẽ, tôi có thể xác định hệ số tỷ lệ (để sau đó tôi sẽ sử dụng mét và không phải pixel làm tham số). Điều này sẽ làm việc minh bạch cho tôi và sẽ là giải pháp lựa chọn của tôi, nhưng tất nhiên nó nên được thực hiện trong phần mềm trung gian, vì vậy nó không phải là một lựa chọn thực sự.

... Dù sao đi nữa: vì đây là một vấn đề rất phổ biến, tôi tự hỏi liệu có một mô hình được thiết lập nào giải quyết vấn đề này một cách tao nhã mà tôi không thể tìm thấy.

PS: Đối với dự án này, tôi đang sử dụng python (với pygame ), nhưng - mặc dù câu trả lời dành riêng cho python / pygame rất được đánh giá cao, tôi quan tâm đến mô tả chung / cấp cao của mẫu hơn là triển khai cụ thể.

Cảm ơn bạn trước thời gian và chuyên môn của bạn.

Câu trả lời:


6

Cách tiêu chuẩn để làm điều đó là thiết lập một ma trận biến đổi để thực hiện chuyển đổi trong khi kết xuất. Để hiển thị 3D, đó là ma trận biến đổi chế độ xem cho máy ảnh thực hiện.

Hầu hết các API 2D đều có cách chỉ định chuyển đổi chế độ xem, như ma trận 2x3 hoặc theo tỷ lệ, dịch và xoay riêng biệt.

Nhìn nhanh vào tài liệu pygame cho thấy bạn sẽ phải tự thực hiện ma trận biến đổi chế độ xem. Nó có cho phép bạn lấy lớp riêng của mình từ lớp bề mặt để cho phép bạn thêm chức năng đó không?


Bạn trả lời rất hữu ích (+1). Tôi có thể phân lớp lớp bề mặt của mình, nhưng tôi cần thêm thời gian để khám phá nếu tôi có thể đạt được những gì được chỉ ra trong bài viết của bạn. Tôi còn rất mới đối với lập trình trò chơi và đồ họa nói chung, bạn có một số liên kết để đề nghị giải thích cách tiếp cận ma trận này (hoặc thậm chí chỉ có toán học liên quan đến việc sử dụng ma trận để chia tỷ lệ bề mặt?). Cảm ơn bạn!
mac

1
Vì nó là 2D và không có phép quay nào liên quan đến @mac về cơ bản là nói đến các hàm bọc và bạn có thể sử dụng phép chia tỷ lệ đơn giản của mình trong các hàm bao. Lý do một ma trận đầy đủ thường được sử dụng là vì hầu hết các API đều có ma trận kiểm soát chế độ xem, nhưng có vẻ như pygame không có nên bạn phải tự mình làm một lớp.
Patrick Hughes

2

vì đây là một vấn đề rất phổ biến, tôi tự hỏi liệu có một mô hình được thiết lập nào giải quyết vấn đề này một cách tao nhã mà tôi không thể tìm thấy.

Thông thường mọi người không cố gắng thực hiện nhân rộng thời gian chạy trong các trò chơi 2D. Tôi không đồng ý rằng đó là một vấn đề phổ biến. Nếu mọi người muốn một bản đồ thu nhỏ hoặc một số thay đổi tỷ lệ cố định khác, thường có một bộ đồ họa mới được thực hiện cho mục đích này. Thật hiếm khi bạn cần bất kỳ thói quen duy nhất nào để chạy ở 2 mức thu phóng khác nhau trong trò chơi 2D.

Nếu bạn sử dụng API 3D, bạn có thể nhận được chức năng này miễn phí - chỉ cần thay đổi các tham số camera / khung nhìn.

PyGame là một API rất cũ và thật không may chỉ thực sự phù hợp với 2D. Ngay cả khi bạn có thể xử lý các hệ thống tỷ lệ phù hợp cho các mức thu phóng khác nhau, hiệu suất sẽ không đủ tốt và ngoại hình có thể sẽ không được chấp nhận.

Tôi sẽ khuyên rằng nếu bạn muốn phóng to và thu nhỏ nhiều, bạn nên chuyển sang API 3D hiện đại càng sớm càng tốt. Tôi muốn giới thiệu pyglet nhưng cũng có khả năng là những người khác.


Cảm ơn câu trả lời của bạn (+1). Tôi đã sử dụng pygletstrong quá khứ cho một mô phỏng 3D. Nó chắc chắn có nhiều khả năng hơn pygame, nhưng hỗ trợ cho 2D ở mức độ thấp hơn so với mức trong pygame. Các tài liệu / ví dụ có sẵn cũng ít chi tiết hơn, đó là điều khó hiểu đối với tôi vì tôi là người mới bắt đầu phát triển trò chơi và tôi thực sự cần phải hiểu cơ sở của hầu hết các hoạt động được thực hiện phổ biến. :) Về "tuổi" của pygame: bạn đã đúng. Một hiện đại hóa đang được tiến hành! :)
mac

Về phần: "Thật hiếm khi bạn cần bất kỳ thói quen duy nhất nào để chạy ở 2 mức thu phóng khác nhau" ... Tôi nghĩ đó là những gì nó sẽ được sử dụng khi thay đổi kích thước cửa sổ / độ phân giải của trò chơi toàn màn hình. Từ nhận xét của bạn tôi đã hiểu nó không phải là: bất kỳ con trỏ đến những gì là "phổ biến" thay vào đó?
mac

Những hoạt động 2D nào bạn đang thực hiện trong đó pyglet ở mức độ thấp hơn pygame? Cả hai đều cho phép bạn vẽ một sprite với 1 dòng mã. Khi bạn thay đổi kích thước cửa sổ của trò chơi 2D, tỷ lệ pixel trên đơn vị thế giới hầu như luôn không đổi. Vì vậy, bạn cuối cùng đã vẽ nhiều họa tiết hơn: bạn không vẽ chúng khác nhau.
Kylotan

Ở khía cạnh cấp thấp: Tôi không thực sự là một chuyên gia về một trong hai lib, nhưng trong pyglets tôi không thể sao chép các hành vi kết xuất nhóm được cung cấp bởi pygame ( pygame.sprite.LayeredUpdatesví dụ như). Đối với tỷ lệ không thay đổi: Tôi hiểu ý của bạn. Hành vi bạn mô tả không phải là hành vi tôi muốn sao chép, nhưng tôi hiểu ý của bạn, cảm ơn vì đã làm rõ! :)
mac

pyglet có các đối tượng Orderedgroup - tài liệu ở đây nếu bạn hoặc bất kỳ ai khác quan tâm: pyglet.org/doc/programming_guide/displaying_images.html#sprites
Kylotan
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.