c++ - 尽管每帧调用一次,但如何仅执行一次方法代码

标签 c++ events input triggers keyboard

我正在编写一个游戏,在我的 InputHandler 类中,我编写了一个 getKeyState 方法,该方法返回是否按下特定键(bool)。

在某些情况下,问题在于,无论我多么努力,按下一个键总是需要“很长时间”,以至于我的 getKeyState 方法多次返回 true,因为它在每一帧都被调用。

当我需要特定的 Action 只执行一次时,我必须这样写:

int n = 0; // global variable

(...)

// --- inside a class method which is called every frame as well: ---

if (Input.getKeyState(key))
{
    n++;

    if (n == 1)
    {
        // specific behaviour
    }
}
else
{
    n = 0;
}

我现在的问题是:如何在我的 InputHandler 类中的方法中实现此目的。我不想每次都声明一个计数器变量,我需要一个“只按下一次键”的方法。我只想打电话:

if (Input.isKeyPressedAndTriggerOnlyOncePls())

最佳答案

编辑: 您需要检查按键,然后检查取消按键。

bool keyPressed = false;

bool InputHandler(){
   if(keyPresed == false){
      if( key is being pressed ){
         keyPressed = true;
         return true;
      }
   }
   else{
      if( key is not being pressed ){
         keyPressed = false;
      }
       return false;
   }
}

编辑2: 如果你真的想要 InputHandler() 做检查,你可以为每个调用者设置一个标志数组,并给每个调用者一个 ID,然后如果 InputHandler() 被调用,键被按下并且 ID 的标志为 false 你返回 true ,否则返回 false,但每次按下键时都必须重置所有标志。

所以前面的代码看起来像这样:

bool arrayReset = true;
bool pressUsed[Number of callers] = {0};

bool InputHandler(int id){
   if(key is being pressed){
      if( pressUsed[id] == false){
         pressUsed[id] = true;
         arrayReset = false;
         return true;
      }
   }
   else if( key is not being pressed && arrayReset == false){
         arrayReset = true;
         set pressUsed[] all elements to false;
   }

return false;
}

编辑3: 如果多次调用该方法但在同一个循环中,则可以执行以下操作:

bool keyPressed = false;

bool InputHandler(){
   if(key is being pressed && keyPresed == false)
     return true;
}


bool InputHandlerWithChange(){
   if(keyPresed == false){
      if( key is being pressed ){
         keyPressed = true;
         return true;
      }
   }
   else{
      if( key is not being pressed ){
         keyPressed = false;
      }
       return false;
   }
}

每次需要检查是否按下某个键时调用 InputHandler()。在循环结束时或在需要检查按键的最后位置调用 InputHandlerWithChange() ,这样当按键按下时所有调用者都会收到 true 并停止接收 true 直到按键未按下。

关于c++ - 尽管每帧调用一次,但如何仅执行一次方法代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681715/

相关文章:

c++ - Windows 密码过滤器 DLL 未加载

javascript - 仅使用 javascript 添加 onclick 事件

Android 网页 View : Disable zoom on input

c++ - 是什么导致我的光线追踪器中出现伪影?

c++ - 复制构造函数会在这里工作吗?

c++ - 如何将 texelFetch 与 GL_TEXTURE_2D 一起使用?

jquery - 获取iframe内容的更改事件?

jquery - 如何使用 jQuery 检查在单击事件期间是否按下了某个键?

c - 如何在c中的函数中手动输入数组?

c++ tron Player lightcycle 朝一个方向移动