Trước tiên, hãy để tôi xin lỗi vì đã đặt câu hỏi có vẻ hơi mơ hồ (hoặc bị chính thức hóa), nhưng tôi thiếu kinh nghiệm để hỏi bất cứ điều gì cụ thể hơn.C# Cấu trúc cho các đối tượng trong trò chơi 2D
Tôi đang xây dựng một công cụ để chơi trò chơi mạo hiểm 2D (loại bạn bấm vào-một-đối tượng-và-điều gì đó xảy ra) trong C# và tôi đang xem xét cấu trúc tốt nhất cho nó. Như bạn có thể hình dung, những thứ khác nhau có thể xảy ra khi bạn tương tác với một vật thể: nếu đó là cánh cửa, bạn sẽ bước vào một căn phòng khác, nếu đó là một người, bạn sẽ bắt đầu nói chuyện với họ, vv Ý tưởng của tôi là đạt được hành vi này với các đại biểu, như thế này:
public abstract class GameObject {
public delegate void onAction();
public onAction Click;
}
public class Door : GameObject {
public Door() {
Click = new onAction(ChangeRoom);
}
private void ChangeRoom() {
//code to change room here
}
}
public class Person : GameObject {
public Person() {
Click = new onAction(StartTalking);
}
private void StartTalking() {
//code to display dialogue here
}
}
tôi thấy giải pháp này khá thanh lịch, vì nếu tôi muốn tạo ra một đối tượng đặc biệt với một số hành vi không được bao phủ bởi các lớp học, tôi chỉ có thể làm điều này:
specialObject.Click += new onAction(SpecialMethod);
Nhưng đây cũng là nơi mọi thứ trở nên phức tạp. Tôi muốn động cơ của mình có khả năng chơi các trò chơi khác nhau chỉ đơn giản bằng cách tải dữ liệu khác nhau, không thay đổi động cơ, vì vậy mã hóa cứng SpecialMethod ở đâu đó bên trong động cơ không phải là tùy chọn, nó phải là một phần của dữ liệu. Đối với đối tượng bình thường, tất cả có thể được thực hiện với (de) serialization, nhưng từ những gì tôi đã đọc, đây là vấn đề với các đại biểu. Bạn có thể đề xuất một cách để làm điều đó?
P.S .: Vì tôi vẫn đang ở cấp khái niệm và mã ở trên chưa được triển khai, bạn được tự do đề xuất bất kỳ giải pháp nào bạn tìm thấy tốt nhất, thậm chí cả giải pháp tránh đại biểu hoàn toàn.
Có vẻ như bạn đang mô tả Công cụ quy tắc http://martinfowler.com/bliki/RulesEngine.html – Jodrell
Tôi nghĩ bạn có thể đăng câu hỏi này tại http://gamedev.stackexchange.com/ – Luca
Cảm ơn bạn @ luca vì liên kết. Chắc chắn sẽ kiểm tra xem nó ra, mặc dù ở cái nhìn đầu tiên, có vẻ như diễn đàn này là một chút chuyên nghiệp hơn tôi. –