2010-07-24 38 views
6

Tôi đang viết một dự án trò chơi làm sở thích và đang tìm kiếm một số lời khuyên về cách tổ chức các đối tượng trò chơi của tôi tốt nhất và các hoạt ảnh khác nhau của chúng.Mô hình kiến ​​trúc hoạt hình

Ví dụ: tôi có một lớp được gọi là Wizard và một lớp là được gọi là Rồng. Một Wizard có ít nhất 10 hình ảnh động khác nhau cụ thể là được liên kết với nó, tùy thuộc vào trạng thái của nó, và tương tự cho Rồng.

Vì vậy, câu hỏi của tôi là thế này: là có một mô hình chuẩn cho tổ chức những loại đối tượng để nó là hiệu quả và dễ dàng mở rộng (ví dụ: nó phải được dễ dàng để thêm mới hình ảnh động và các đối tượng mới)?

Tôi có nhiều ý tưởng khác nhau về cách di chuyển về phía trước về điều này, nhưng tôi không muốn nhận sai điều này vì nó là một phần quan trọng của kiến ​​trúc trò chơi. Nó có vẻ dễ dàng để có được điều này làm việc cho một trò chơi nhỏ , nhưng tôi sợ phức tạp không thể quản lý vì nó được lớn hơn.

+0

Ăn cắp ý tưởng từ các trò chơi nguồn mở hiện có. –

+0

std :: bản đồ - cho bộ nhớ trạng thái hoạt ảnh bên trong và mọi định dạng mở cho bộ nhớ ngoài. – W55tKQbuRu28Q4xv

Trả lời

1

Tôi đề xuất có một giao diện như "Ký tự", xác định những gì tất cả các thực thể này có thể thực hiện. Sau đó, các lớp Dragon và Wizard của bạn chỉ là các triển khai thực hiện.

Tuyến đường khác là có lớp cơ sở mà từ đó bạn mở rộng và sử dụng điều này để kiểm soát "mở rộng phân cấp" được liên kết với các dự án lớn, bằng cách vẽ ra phân cấp các đối tượng của bạn và xác định các lớp cơ sở mở rộng.

0

Không, hoàn toàn không có mẫu chuẩn.

Lời khuyên của tôi là tránh sự cố thiết kế OO mới mẻ của việc cố gắng tìm một giao diện "lớp cơ sở" chung duy nhất cho mọi thứ. Con rồng của bạn là rất khác với Wizard của bạn, và không có gì để đạt được bằng cách cố gắng hợp nhất hai giao diện, ngoại trừ mã trừu tượng dễ thương. Hãy nhớ rằng, kế thừa không phải là một công cụ để tái sử dụng mã.

Cách tiếp cận đơn giản nhất là để mỗi đối tượng duy trì trạng thái nội bộ riêng của nó (như bạn đã mô tả) và có thể vẽ trạng thái đó. Đây là nơi một tuyên bố chuyển đổi trường học cũ có thể rõ ràng hơn việc sử dụng đa hình cho cùng một hiệu ứng. Ví dụ:

class Dragon { 
enum State { asleep, flying, breathing_fire }; 
public: 
void draw() { /* old-school switch */ 
    switch (cur_state){ 
    case asleep: draw_asleep(); 
    case flying: draw_flying(); 
    case breathing_fire: draw_breathing_fire(); 
    } 
    } 
private: 
    void draw_asleep(); 
    void draw_flying(); 
    void draw_breathing_fire(); 
}; 

Nhà phát triển C++ có kinh nghiệm sẽ phát ra mã ở trên (như họ cần), vì tuyên bố chuyển đổi gần như chính xác là cuộc gọi phương thức đa hình sẽ thực hiện - gửi thời gian chạy. Ý kiến ​​cá nhân của tôi là đối với loại lớp cụ thể này, tức là, một giao diện công cộng duy nhất đóng gói một máy trạng thái, câu lệnh switch là rõ ràng hơn và có thể bảo trì được vì nó làm cho máy trạng thái nhảy rõ ràng. Tôi nghĩ rằng nó cũng rõ ràng rằng tôi nhận ra điều này là thường thiết kế xấu C++.

Sự ma sát của thiết kế này là do đường phân chia giữa máy trạng thái và giao diện công cộng duy nhất. Một con rồng ngủ rõ ràng không giống như một con rồng bay. Trong thực tế, nó sẽ có chỉ là về không có gì chung. Nhưng thiết kế cấp cao hơn nói rằng cả hai đều là con rồng CÙNG. Thật là một mớ hỗn độn! Bạn có tạo các đối tượng Rồng khác nhau cho mỗi trạng thái không? Không, bởi vì điều đó sẽ làm lộ khái niệm trạng thái cho người gọi. Bạn có tạo các đối tượng trợ giúp nội bộ khác nhau cho mỗi trạng thái và gửi đến các trạng thái đó không? Có thể, nhưng nó nhanh chóng bị lộn xộn. Cách tiếp cận trên là một sự thỏa hiệp giữa hai người.Hãy suy nghĩ về tuyên bố chuyển đổi như cô lập sự xấu xí. Giao diện công cộng là sạch sẽ, như là giao diện riêng tư. Chỉ có tuyên bố chuyển đổi chứa mớ hỗn độn bẩn thỉu. Xem xét cách tiếp cận này và cũng xem xét các đề xuất khác.

Cuối cùng, để vẽ Hướng dẫn của bạn và Dragon của bạn, một mẫu wrapper đơn giản hoặc functor sẽ đủ:

struct Draw { 
    template <class S> 
    void operator()(S& s) { s.draw(); } 
}; 

Vấn đề là bạn không cần phải hợp nhất hai lớp khác nhau chỉ vì cả hai đều hỗ trợ cùng một hoạt động logic.

Các vấn đề liên quan