8

Tôi là một nhà phát triển có kinh nghiệm mới phát triển trò chơi và tôi đã tạo một trò chơi platformer 3D đơn giản nhưng hợp lý và đang tìm cách để làm cho kiến ​​trúc có thể mở rộng hơn.Kỹ thuật tốt để xử lý thay đổi trạng thái và trạng thái trong phát triển trò chơi là gì?

Cách tốt để xử lý trạng thái phát triển trò chơi là gì?
Một cách tiếp cận rất ngây thơ là phải có nhiều phép toán như:

time_stopped = True 
time_slow_motion = False 
level_loaded = True 
level_paused = True 
level_completed = False 

này rất linh hoạt vì một lỗi phát triển có thể dẫn đến time_stopped = Truetime_slow_motion = True cùng một lúc, trong đó sẽ phá hủy trò chơi logic.

Tôi đang tìm kiếm một cách tiếp cận tốt hơn theo hướng:

class TimeState: 
    STOPPED = 0 
    SLOW_MOTION = 1 
    NORMAL = 2 
    current_state = 0 

    def isStopped(self): 
     if current_state == self.STOPPED: return True 

Nhưng làm thế nào tôi sẽ xử lý nhiều nhóm của nhà nước một cách tốt? Tôi có thể tạo một số LevelState có trạng thái LOADED, PAUSEDCOMPLETED. Nhưng làm cách nào để xử lý các nhóm trùng lặp như khi LevelStateTimeStatePAUSED phải luôn giống nhau? Có một mô hình thiết kế tốt hay thực hành tốt về cách giải quyết quản lý nhà nước?

Cách tốt để xử lý thay đổi trạng thái là gì?
Suy nghĩ của tôi là đưa ra đối tượng trạng thái ví dụ. LevelState chức năng gọi lại để thực hiện trên bất kỳ thay đổi trạng thái nào - hoặc để thăm dò đối tượng trạng thái mỗi vòng lặp trò chơi như if level_state.changedTo() == LevelState.COMPLETED: doStuff(). Có cách nào tốt hơn để xử lý việc này không? Hàng đợi tin nhắn/sự kiện? Tôi không muốn nhúng logic vào các đối tượng nhà nước.
Tôi cũng quan tâm đến việc có nên xử lý cả hai sự kiện changedFromchangedTo và điều gì sẽ xảy ra nếu logic được kích hoạt bởi changedFrom thay đổi trạng thái của đối tượng trước khi logic changedTo được kích hoạt - ai thắng?

Tôi không muốn câu trả lời cụ thể về ngôn ngữ/triển khai nhưng lời khuyên về cách hay để suy nghĩ về kiến ​​trúc khôn ngoan.

+0

sử dụng bộ python() và tạo bộ, bạn có thể căn cứ logic của mình trên set.issubset(), v.v., tôi tin rằng bạn muốn sử dụng mẫu quan sát – pyInTheSky

+0

@pyInTheSky Cảm ơn bạn đã chỉ ra mẫu quan sát! Tôi nhận thức được các cách hiệu quả để viết mã này trong python (mặc dù trò chơi hiện tại là trong C#), nhưng đã cố gắng làm cho ví dụ dễ đọc hơn nhanh chóng –

+2

nếu bạn chỉ muốn một máy trạng thái dễ dàng, tôi đã đăng trạng thái hoạt động này: http: //code.activestate.com/recipes/577693-dynamically-generated-python-state-machine/ :: tôi đã sửa đổi nó nhưng không được đăng lại, bạn có thể dễ dàng chuyển đổi nó để trả về một bộ tuple và có hàm run() hoạt động như một trọng tài, do đó, nó không xây dựng một cuộc gọi khổng lồ ngăn xếp. Ngoài ra còn có một số mod khác mà tôi chưa tải lên, như yêu cầu sm tự tái tạo nếu bạn thêm trạng thái, v.v ... nhưng rất đơn giản và có thể giúp bạn – pyInTheSky

Trả lời

2

Đây là một điều phổ biến như vậy mà thậm chí còn có một mẫu: The State Pattern

Vào lúc bắt đầu, nó có vẻ như phương pháp này có một số phí, nhưng như logic phức tạp hơn, bạn sẽ thấy được lợi ích.

+0

Cảm ơn bạn đã chỉ ra Mẫu trạng thái.Tất nhiên tôi tìm thấy nó thông qua google nhưng tôi tự hỏi nếu có các biến thể/mở rộng của nó phù hợp với phát triển game tốt hơn (vì nó rất chung chung/đơn giản). Tôi cũng quan tâm đến cách tôi có thể xử lý sự thay đổi của các nhóm trạng thái chồng chéo và nhà nước. –

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