[MSM] Single event, multiple orthogonal submachines

I'm trying to deal with having multiple orthogonal submachines that process one event containing data. I have a contrived example that hopefully conveys the issue. Suppose I am hoping to create a state machine "Game2D" with a set of orthogonal submachines that guard certain transitions based on each other, and I would like some events to be processed by multiple submachines. Parent Machine: Game2D Event: CharacterStatus - contains character position and velocity Submachines: IsMoving - changes state based on CharacterStatus CorrectPosition - updates position based on CharacterStatus CharacterStatusUpToDate - times out to an error state if CharacterStatus hasn't been received for a while EnemyAlive - doesn't process CharacterStatus RunSystem - guards some transitions based on the state of IsMoving Since some, but not all of these submachines needs the "CharacterStatus" event, what is the best way to make sure they all get it when I call Game2D.process_event(CharacterStatus)? I want to be able to reuse these pieces, and keep things as simple as possible. Does this seem like an ok approach? Should I simply have a state "UpdateCharacterStatus" that directly updates each of these objects then creates an event to transition away, or something else entirely? Cheers! Andrew Hundt

You don't need to do anything. If every submachine is in its own orthogonal region, then MSM gives each of them a chance to process the event (in the order defined by your initial_state typedef). And if some are not interested, nothing bad happens, only the interested regions will process.
I think you're doing it right. If you also provide a MSM flag in isMoving, you'll be able to check its status in RunSystem. The only thing is that submachines are compile-time-intensive. If it becomes too bad, you might have to switch to regions without submachines. They won't be reusable but otherwise they'll do the same job.
Cheers! Andrew Hundt
Cheers! Christophe
participants (2)
-
Andrew Hundt
-
Christophe Henry