Lý lịch
Tôi phát triển game như một sở thích, và đang tìm kiếm một cách tốt hơn để thiết kế chúng. Hiện tại, tôi đang sử dụng một phương pháp OOP tiêu chuẩn (Tôi đã thực hiện phát triển doanh nghiệp được 8 năm nên nó xuất hiện thường xuyên). Lấy ví dụ một "baddie"
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
Vấn đề
Hãy nói rằng tôi đang tạo một platformer 2d và cần baddie để có thể Nhảy. Thông thường những gì tôi làm là thêm mã thích hợp trong các phương thức Update / GetInput. Sau đó, nếu tôi cần làm cho người chơi bò, vịt, leo trèo, v.v ... mã sẽ đến đó.
Nếu tôi không cẩn thận, các phương thức đó sẽ bị lộn xộn, vì vậy tôi sẽ tạo ra các cặp phương thức như thế này
CheckForJumpAction(Input input)
và DoJump()
CheckforDuckAction(Input input)
và DoDuck()
vì vậy GetInput trông giống như
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
và Cập nhật trông giống như
public void Update()
{
DoJump();
DoDuck();
}
Nếu tôi đi và tạo một trò chơi khác mà người chơi cần phải nhảy và đạp vịt, tôi thường vào một trò chơi có chức năng và sao chép nó. Lộn xộn, tôi biết. Đó là lý do tại sao tôi đang tìm kiếm một cái gì đó tốt hơn.
Giải pháp?
Tôi thực sự thích cách Blend có các hành vi tôi có thể gắn vào một yếu tố. Tôi đã suy nghĩ về việc sử dụng khái niệm tương tự trong các trò chơi của tôi. Vì vậy, hãy nhìn vào các ví dụ tương tự.
Tôi sẽ tạo một đối tượng Hành vi cơ sở
public class Behavior
{
public void Update()
Public void GetInput()
}
Và tôi có thể tạo ra các hành vi bằng cách sử dụng đó. JumpBehavior:Behavior
vàDuckBehavior:Behavior
Sau đó tôi có thể thêm một tập hợp các hành vi vào cơ sở Sprite và thêm những gì tôi cần cho mỗi thực thể.
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
Vì vậy, bây giờ Nếu tôi muốn sử dụng Jump và Duck trong nhiều trò chơi, tôi chỉ có thể mang các hành vi qua. Tôi thậm chí có thể làm một thư viện cho những người phổ biến.
Nó có hoạt động không?
Những gì tôi không thể tìm ra là làm thế nào để chia sẻ trạng thái giữa họ. Nhìn vào Jump và Duck, cả hai không chỉ ảnh hưởng đến phần hiện tại của kết cấu được vẽ mà còn ảnh hưởng đến trạng thái của người chơi. (Nhảy sẽ áp dụng một lực giảm dần theo thời gian, trong khi vịt sẽ ngừng chuyển động, thay đổi kết cấu và kích thước va chạm của baddie.
Làm thế nào tôi có thể buộc nó lại với nhau để nó hoạt động? Tôi có nên tạo thuộc tính phụ thuộc giữa các hành vi? Tôi có nên cho mỗi hành vi biết về cha mẹ và trực tiếp sửa đổi nó không? Một điều tôi nghĩ là có thể chuyển một đại biểu vào từng hành vi để được thực thi khi nó được kích hoạt.
Tôi chắc chắn có nhiều vấn đề hơn tôi đang xem xét, nhưng toàn bộ mục đích là để tôi có thể dễ dàng sử dụng lại các hành vi này giữa các trò chơi và các thực thể trong cùng một trò chơi.
Vì vậy, tôi chuyển nó cho bạn. Quan tâm để giải thích làm thế nào / nếu điều này có thể được thực hiện? Bạn có ý kiển nào tốt hơn không? Tôi là tất cả tai.