Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: How to realize a state machine based SFML?  (Read 272 times)

0 Members and 1 Guest are viewing this topic.


  • Newbie
  • *
  • Posts: 2
    • View Profile
How to realize a state machine based SFML?
« on: April 20, 2024, 01:38:41 pm »
Hello everyone.
I am trying to realize a simple game engine based on SFML. It has a state machine, that represents the LIFO queue. My base state class looks something like this:

class AbstractScene
    virtual handleEvents(const sf::Event& event) = 0;

    virtual updateLogic(const sf::Time& time) = 0;

    virtual draw() = 0;

Methods of the state machine are cached to be called simultaneously when the state machine has finished handle events, update logic and draw all states.

I pushed the Level state. I set pause and pushed Menu state by pressing a mouse button. It works, but I can get a few identical events (sf::Event::MouseButtonPressed) at the one frame loop and I have the three same states (but I should have the only one):

class Level : public AbstractScene
    void handleEvents(const sf::Event& event) override
         if(event.type == sf::MouseButtonPressed)
              // append new scene
              stateMachine.push(new Menu());

I can add a boolean flag that will collect the general value of this event and I will handle it at the "updateLogic" method. However, my state machine blocks this method when it paused.

So how and where should I change the states and how should I realize the game pause?

PS: sorry for my bad Engish. Thank you very much!


  • SFML Team
  • Hero Member
  • *****
  • Posts: 10914
    • View Profile
    • development blog
    • Email
Re: How to realize a state machine based SFML?
« Reply #1 on: April 22, 2024, 08:25:07 am »
In my SmallGameEngine state machine example, I can create a new state anywhere in the code, it will be stored as m_next and only applied in the next state machine loop iteration.

This guarantees that the state doesn't just suddenly change and leaves the freedom to create a new state anywhere within the current state.
Official FAQ: https://www.sfml-dev.org/faq.php
Official Discord Server: https://discord.gg/nr4X7Fh
Dev Blog: https://duerrenberger.dev/blog/