在游戏更新循环中计算布尔的真/假变化

Count bool true/false change inside game update loop

本文关键字:变化 布尔 计算 游戏 更新 循环      更新时间:2023-10-16

计算布尔标志在游戏更新循环中从 false 更改为 true 的次数的最佳方法是什么?例如,如果我在下面有这个简单的例子,如果您按住按钮"A"按下输入类,则将 Game 类的启用布尔值设置为 true,如果您释放它,则将其设置为 false,并且 Game 类内计算启用次数的计数器从 true 更改为 false。例如,如果您按"A"并释放两次,计数器应更新为 2。让 Game::Update() 以 60fps 的速度更新计数器在当前方法下是错误的。为了修复它,我将检查和计数器移到了 SetEnable 中,而不是更新循环。

// 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;
*/
}
void Game::Update()
{
if (key == KEY_A && ! enable_)
{
enable_ = true;
++counter_;
}
else if (key == KEY_B)
enable_ = false;
}

如果我猜对了,你想数enable_更改了多少次。你的代码有一个小缺陷,想象一下这个例子:

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

例如,可能解决此问题的函数可能如下所示:

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;
}
}