Jestem doświadczonym programistą zajmującym się tworzeniem gier. Stworzyłem dość prostą, ale działającą grę platformową 3D i szukam sposobów na zwiększenie skalowalności architektury.Jakie są dobre techniki radzenia sobie ze zmianami stanu i stanu w tworzeniu gier?
Jaki jest dobry sposób na radzenie sobie z rozwojem gier?
bardzo naiwne podejście jest mieć wiele wartości logicznych takich jak:
time_stopped = True
time_slow_motion = False
level_loaded = True
level_paused = True
level_completed = False
Jest to bardzo nieelastyczny gdyż błąd deweloper może doprowadzić do time_stopped = True
i time_slow_motion = True
w tym samym czasie, co zniszczy gra logiczna.
szukam lepszego podejścia w kierunku:
class TimeState:
STOPPED = 0
SLOW_MOTION = 1
NORMAL = 2
current_state = 0
def isStopped(self):
if current_state == self.STOPPED: return True
Ale jak będę obsługiwać wiele grup Stanu w dobry sposób? Mogłem utworzyć stany LevelState
, które mają stany:. Ale jak obsługiwać nakładające się grupy, na przykład, gdy LevelState
i TimeState
PAUSED
powinny być zawsze takie same? Czy istnieje dobry wzór projektu lub dobra praktyka w zakresie rozwiązywania problemów związanych z zarządzaniem państwem?
Jaki jest dobry sposób na zmianę stanu?
Moje myśli są albo podać obiekt stanu np.. LevelState
funkcje wywołania zwrotnego do wykonania przy dowolnej zmianie stanu - lub do odpytywania obiektu stanu w każdej pętli gry, np. if level_state.changedTo() == LevelState.COMPLETED: doStuff()
. Czy są lepsze sposoby radzenia sobie z tym? Kolejki/zdarzenia wiadomości? Nie chcę osadzać logiki w obiektach stanu.
Interesuje mnie również, czy należy obsłużyć zarówno zdarzenia changedFrom
i changedTo
, jak i to, co się stanie, jeśli logika wywołana przez changedFrom
zmieni stan obiektu przed wyzwoleniem logiki changedTo
- kto wygra?
Nie chcę odpowiedzi na temat implementacji/języka, ale porady na temat tego, jak mądrze myśleć w kategoriach architektonicznych.
używać zestawu python() i tworzyć zestawy, można oprzeć swoją logikę na set.issubset(), itp ... również, wierzę, że chcesz wykorzystać wzór obserwatora – pyInTheSky
@pyInTheSky Dzięki za wskazanie wzoru obserwatora! Jestem świadomy wydajnych sposobów kodowania tego w python (chociaż bieżąca gra jest w C#), ale próbowałem uczynić przykłady bardziej czytelnymi niż szybki –
, jeśli chcesz tylko łatwy automat stanów, napisałem to na stanie aktywnym: http: //code.activestate.com/recipes/577693-dynamically-generated-python-state-machine/ :: zmodyfikowałem go, ale nie przeładowałem, możesz go łatwo przełączyć na krotkę i mieć funkcję run(), która działa jako arbiter, więc nie buduje gigantycznego stosu wywołań. Są też inne mody, których nie przesłałem, np. Prośba o ponowne wygenerowanie pliku, jeśli dodasz stan, itd ... ale jest to bardzo proste i może ci pomóc – pyInTheSky