2014-02-19 66 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'类,否则你可以忽略它。 –

相关问题