[英]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.