2014-02-19 68 views
0

我正在爲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來解決我的問題,但它在運行時不起作用。

我希望我能正確解釋我的問題。最好的祝福。

+0

你是什麼意思與*只有當用戶已經包括庫本身*?在一個翻譯單位?在所有翻譯單位?在包含後者的其他包含文件之前? –

+0

@DavidRodríguez-dribeas我對鍵盤和鼠標都有一個靜態類,主循環將按下按鍵和按鈕的狀態保存到每個相應的類。我想我的主循環,只有這樣做,如果用戶包含鍵盤和鼠標文件,因爲這意味着用戶將要讀取輸入。附:即使用戶在主循環文件之後包含鍵盤和鼠標文件,我也希望這能夠工作,如果用戶之前包含這些文件,那麼只包含保護程序。 –

回答

2

的包括後衛是關鍵:

#ifdef KEYBOARD_INPUT 
DGL::Keyboard kbd; 
#endif 

... 

#ifdef KEYBOARD_INPUT 
kbd.insertEvent(...); 
#endif 
+0

是的,但我認爲這隻適用於用戶在此代碼之前包含'Keyboard.h'文件嗎? –

+0

是的,這是你的問題的整個觀點:「我想找到一種方法來調用Keyboard :: insertEvent()(從gameloop)**只有當用戶包含庫本身(Keyboard.h)。** 」。如果用戶包含'keyboard.h',那麼你可以使用'Keyboard'類,否則你可以忽略它。 –

相關問題