Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Count bool true/false change inside game update loop

Tags:

c++

What would be the best way of counting how many times a bool flag was changed from false to true inside a game update loop? For example if I have this simple example below, where if you hold button "A" pressed the Input class sets the enable bool of the Game class to true and if you release it sets it to false and a counter inside the Game class that counts how many times enable was changed from true to false. For example if you press "A" and release twice counter should update to 2. Having Game::Update() updating at 60fps the counter would be wrong with the current approach. To fix it I moved the check and the counter inside SetEnable instead of the Update loop.

// Input class

// Waits for input
void Input::HandleKeyDown()
{
    // Checks if key A is pressed down
    if (key == KEY_A)
        game.SetEnable(true);

}

void Input::HandleKeyUp()
{
    // Checks if key A is released
    if (key == KEY_A)
        game.SetEnable(false);

}

// Game class

void Game::SetEnable(bool enable)
{
    if(enable == enable_)
        return;

    enable_ = enable;

    //Will increment the counter as many times A was pressed
    if(enable)
        counter_ += 1;
}

void Game::Update()
{
    // Updates with 60fps
    // Will increment the counter as long as A is pressed
    /*
    if(enable_ == true)
        counter_ += 1;
    */
}
like image 317
sabotage3d Avatar asked Feb 25 '26 20:02

sabotage3d


2 Answers

void Game::Update()
{
    if (key == KEY_A && ! enable_)
    {
        enable_ = true;
        ++counter_;
    }
    else if (key == KEY_B)
        enable_ = false;
}
like image 124
erenon Avatar answered Feb 27 '26 08:02

erenon


If I get you right, you want to count how many times enable_ changes. Your code has a small flaw, imagine this example:

enable_ = false
counter = 0
update gets called, key is A -> enable_ = true, counter = 1
update gets called, key is B -> enable_ = false, counter remains 1

Function that might fix this can look, for example, like this:

void Game::Update() {
    if (key == KEY_A && !enable_) { // key is A and previous state is false
        ++counter;
        enable_ = true;
    }
    if (key == KEY_B && enable_) { // key is B and previous state is true
        ++counter;
        enable_ = false;
    }
}
like image 39
Marek Chocholáček Avatar answered Feb 27 '26 09:02

Marek Chocholáček