Khi tạo trò chơi, bạn thường tạo đối tượng trò chơi sau mà tất cả các thực thể kế thừa:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
Vì vậy, trong vòng cập nhật, bạn lặp lại tất cả các đối tượng trò chơi và cho chúng cơ hội thay đổi trạng thái, sau đó trong vòng rút thăm tiếp theo, bạn lặp lại lần nữa trên tất cả các đối tượng trò chơi và cho chúng cơ hội tự vẽ.
Mặc dù điều này hoạt động khá tốt trong một trò chơi đơn giản với trình kết xuất chuyển tiếp đơn giản, nhưng nó thường dẫn đến một vài đối tượng trò chơi khổng lồ cần lưu trữ mô hình của chúng, nhiều kết cấu và tệ nhất là phương pháp vẽ béo tạo ra sự khớp nối chặt chẽ giữa đối tượng trò chơi, chiến lược kết xuất hiện tại và bất kỳ lớp liên quan đến kết xuất nào.
Nếu tôi thay đổi chiến lược kết xuất từ chuyển tiếp sang hoãn lại, tôi sẽ phải cập nhật rất nhiều đối tượng trò chơi. Và các đối tượng trò chơi tôi tạo ra không thể tái sử dụng như chúng có thể. Tất nhiên sự kế thừa và / hoặc thành phần có thể giúp tôi chống lại sự sao chép mã và làm cho việc thay đổi triển khai dễ dàng hơn một chút nhưng nó vẫn cảm thấy thiếu.
Một cách tốt hơn, có lẽ, sẽ là loại bỏ hoàn toàn phương thức Draw khỏi lớp GameObject và tạo một lớp Renderer. GameObject vẫn cần chứa một số dữ liệu về hình ảnh của nó, như mô hình nào để thể hiện nó và họa tiết nào sẽ được vẽ trên mô hình, nhưng cách thực hiện sẽ được để lại cho trình kết xuất. Tuy nhiên, thường có rất nhiều trường hợp viền trong kết xuất, vì vậy mặc dù điều này sẽ loại bỏ khớp nối chặt chẽ từ GameObject sang Trình kết xuất, Trình kết xuất vẫn phải biết về tất cả các đối tượng trò chơi sẽ làm cho nó béo, tất cả đều biết và liên kết chặt chẽ. Điều này sẽ vi phạm khá nhiều thực hành tốt. Có lẽ Data-định hướng-thiết kế có thể thực hiện các mẹo. Các đối tượng trò chơi chắc chắn sẽ là dữ liệu, nhưng trình kết xuất sẽ được điều khiển bởi điều này như thế nào? Tôi không chắc.
Vì vậy, tôi thua lỗ và không thể nghĩ ra một giải pháp tốt. Tôi đã thử sử dụng các nguyên tắc của MVC và trong quá khứ tôi đã có một số ý tưởng về cách sử dụng nó trong các trò chơi, nhưng gần đây nó dường như không thể áp dụng như tôi nghĩ. Tôi rất muốn biết làm thế nào tất cả các bạn giải quyết vấn đề này.
Dù sao, hãy tóm tắt lại, tôi quan tâm đến cách đạt được các mục tiêu thiết kế sau đây.
- Không có logic kết xuất trong đối tượng trò chơi
- Khớp nối lỏng lẻo giữa các đối tượng trò chơi và công cụ kết xuất
- Không ai biết trình kết xuất
- Tốt nhất là chuyển đổi thời gian chạy giữa các công cụ kết xuất
Thiết lập dự án lý tưởng sẽ là một 'logic trò chơi' riêng biệt và kết xuất dự án logic không cần tham chiếu lẫn nhau.
Suy nghĩ này đã bắt đầu khi tôi nghe John Carmack nói trên twitter rằng anh ta có một hệ thống linh hoạt đến mức anh ta có thể trao đổi các công cụ kết xuất trong thời gian chạy và thậm chí có thể bảo hệ thống của mình sử dụng cả hai trình kết xuất (trình kết xuất phần mềm và trình kết xuất được tăng tốc phần cứng) đồng thời để anh ta có thể kiểm tra sự khác biệt. Các hệ thống tôi đã lập trình cho đến nay thậm chí không gần linh hoạt