我正在编写一个游戏,在我的 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/