簡體   English   中英

盡管每幀調用一次,但如何只執行一次方法代碼

[英]How to execute method code only once although called every frame

我正在編寫游戲,在我的InputHandler類中,我編寫了一個getKeyState方法,該方法返回是否按下特定鍵(布爾)。

在某些情況下,問題是,無論我多么努力,按下鍵總是要花很長時間,以至於我的getKeyState方法多次返回true,因為它被稱為每一幀。

當我需要僅執行一次的特定操作時,我必須編寫如下內容:

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

Edit2:如果您真的希望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;
}

Edit3:如果多次調用該方法但在同一循環中,則可以執行以下操作:

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。

一種方法是使父類具有靜態數據成員。 然后,您可以創建從該類繼承的輸入處理程序。

// Main parent class
class InputHandlerParent {
public:
    InputHandlerParent() {} ;
    virtual bool isKeyPressedAndTriggerOnlyOncePls()
    {
        return keypressed;
    }
    virtual void setKeyPressed()
    {
        keypressed = true ;
        std::cout << "YOU PRESSED THE KEY!" << std::endl;
    }
    virtual void unsetKeyPressed()
    {
        keypressed = false ;
        std::cout << "YOU RELEASED THE KEY!" << std::endl;
    }
protected:
    static bool keypressed ;
private:
};

// Now an example child class
class InputHandlerChild : public InputHandlerParent {
public:
    InputHandlerChild() :
        InputHandlerParent()
    {};
protected:
private:
};

// Define keypressed
bool InputHandlerParent::keypressed = false ;

所有繼承的子類都共享keypressed變量,因此,如果執行以下操作:

#include <iostream>
int main()
{
    InputHandlerChild child1 ;
    InputHandlerChild child2 ;

    std::cout << "Child1 pressed: " << child1.isKeyPressedAndTriggerOnlyOncePls() << std::endl;
    std::cout << "Child2 pressed: " << child2.isKeyPressedAndTriggerOnlyOncePls() << std::endl;

    // Now set the key as pressed
    child1.setKeyPressed() ;

    std::cout << "Child1 pressed: " << child1.isKeyPressedAndTriggerOnlyOncePls() << std::endl;
    std::cout << "Child2 pressed: " << child2.isKeyPressedAndTriggerOnlyOncePls() << std::endl;

    // Unset the key ONLY if it was set for child2
    if (child2.isKeyPressedAndTriggerOnlyOncePls()) {
        child2.unsetKeyPressed() ;
    }

    std::cout << "Child1 pressed: " << child1.isKeyPressedAndTriggerOnlyOncePls() << std::endl;
    std::cout << "Child2 pressed: " << child2.isKeyPressedAndTriggerOnlyOncePls() << std::endl;

    return 0 ;
}

這給出了輸出

Child1 pressed: 0
Child2 pressed: 0
YOU PRESSED THE KEY!
Child1 pressed: 1
Child2 pressed: 1
YOU RELEASED THE KEY!
Child1 pressed: 0
Child2 pressed: 0

因此,即使我只為一個孩子按下它,每個人都知道它被按下了。 基本上,只要按下按鍵,你可以調用setKeyPressed()來設置keypressed為true。 然后,每當取消設置鍵的操作發生時,您都可以調用unsetKeyPressed()以使所有人都知道不再按下該鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM