• [^] # Re: Machine à états ?

    Posté par (site web personnel) . En réponse au journal Sunday Python Pattern : Une machine à état toute simple. Évalué à 3.

    Je ne voulais pas du tout invalider ton approche

    Loin de moi l'idée de penser ça, j'apprécie grandement tes éclaircissements sur le sujet.

    Je connais pas les machines à états basées sur une stack, je regarderais.

    Pour faire simple, on aurait :

    class State:
     def on_enter(self):
     pass
     def on_update(self):
     pass
     def on_pause(self):
     pass
     def on_resume(self):
     pass
     def on_exit(self):
     pass
    class StateMachine:
     def __init__(self, initial_state):
     self.states = [initial_state]
     initial_state.on_enter()
     def update(self):
     if len(self.states) == 0:
     return
     current_state = self.states[-1]
     action = current_state.on_update()
     match action:
     case "pop":
     current_state.on_exit()
     self.states.pop()
     if len(self.states) > 0:
     current_state = self.states[-1]
     current_state.on_resume()
     case ("push", new_state):
     current_state.on_pause()
     new_state.on_enter()
     self.states.append(new_state)

    Après, selon ce que tu veux faire, tu modifie la signature des callbacks pour prendre en paramètre un delta_time, un contexte, ou tout ce que tu veux.

    Avec ce modèle, mettre le jeu en pause revient à pousser le state Paused, et reprendre le jeu revient à pop ce state. Peu importe le state précédent cela fonctionnera de la même manière. C'est dans le on_update() que l'on va récupérer (ou ignorer) les inputs et autres scripts/actions du jeu. Les autres callbacks sont utiles pour tout ce qui est chargement de ressource ou déclenchement de script.

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg