我正在爲SDL編寫一個用於編程的小型庫。該庫負責遊戲循環,鍵盤和鼠標輸入。我已經分居圖書館在3個小檔案:如何檢查(在運行時)用戶是否包含文件
- ./gamelibrary.h
- ./Input/Keyboard.h
- ./Input/Mouse.h
現在,主要的遊戲循環,我檢查SDL_Quit事件(所以我可以提供一個可以默認關閉的窗口),還有鍵盤和鼠標事件。鍵盤和鼠標類是靜態類,可隨時訪問以獲得鍵盤/鼠標狀態(就像XNA一樣)。我寫的鍵盤類,如下所示:
#ifndef KEYBOARD_INPUT
#define KEYBOARD_INPUT
#include <set>
namespace DGL
{
struct KeyboardState {
std::set<Uint8> keys;
bool isKeyDown(Uint8 key)
{
return keys.find(key) != keys.end();
}
bool isKeyUp(Uint8 key)
{
return !isKeyDown(key);
}
};
class Keyboard {
/**
* This class handles keyboard input game-like
*/
private:
static std::queue<SDL_Event> events;
public:
void insertEvent(SDL_Event event)
{
events.push(event);
}
void eraseEvents()
{
std::queue<SDL_Event> empty;
swap(events, empty);
}
static KeyboardState getKeyBoardState()
{
KeyboardState state;
while (!Keyboard::events.empty())
{
SDL_Event event = events.front();
Keyboard::events.pop();
state.keys.insert(event.key.keysym.sym);
}
return state;
}
};
std::queue<SDL_Event> Keyboard::events;
}
#endif
正如你所看到的,用戶可以使用該方法Keyboard::getKeyboardState()
獲得結構與鍵盤的當前狀態。像這樣:
...
...
KeyboardState state = Keyboard::getKeyboardState()
if (state.isKeyDown(SDLK_w))
{
....
}
....
的結構被使用的事件在「事件」靜態的std ::隊列,這從遊戲環接收它的值,當事件不是SDL_QUIT但SDL_KEYDOWN填充。
我想找到一種方法來調用Keyboard::insertEvent()
(從gameloop)只有當用戶包含庫本身(Keyboard.h)。如你所見,我試圖用include-guard來解決我的問題,但它在運行時不起作用。
我希望我能正確解釋我的問題。最好的祝福。
你是什麼意思與*只有當用戶已經包括庫本身*?在一個翻譯單位?在所有翻譯單位?在包含後者的其他包含文件之前? –
@DavidRodríguez-dribeas我對鍵盤和鼠標都有一個靜態類,主循環將按下按鍵和按鈕的狀態保存到每個相應的類。我想我的主循環,只有這樣做,如果用戶包含鍵盤和鼠標文件,因爲這意味着用戶將要讀取輸入。附:即使用戶在主循環文件之後包含鍵盤和鼠標文件,我也希望這能夠工作,如果用戶之前包含這些文件,那麼只包含保護程序。 –