如何检查(在运行时)用户是否包含文件

时间:2014-02-19 02:14:18

标签: c++ input keyboard include sdl

我正在SDL中编写一个用于游戏编程的小型库。该库负责游戏循环,键盘和鼠标输入。我已经将库分成3个小文件:

  • ./ gamelibrary.h
  • ./输入/ Keyboard.h
  • ./输入/ Mouse.h

现在,在主游戏循环中,我检查SDL_Quit事件(因此我可以提供一个默认情况下可以关闭的窗口),还有键盘和鼠标事件。 Keyboard和Mouse类是静态类,可以随时访问以获得键盘/鼠标状态(就像XNA一样)。我按如下方式编写了Keyboard类:

#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) )
{
    ....
}
....

使用'events'static std :: queue中的事件来填充struct,当事件不是SDL_Quit而是SDL_KEYDOWN时,它会从游戏循环中接收它们的值。

如果用户包含库本身(Keyboard.h),我想找到一种方法来调用Keyboard::insertEvent()(来自游戏循环)。

正如您所看到的,我尝试使用包含防护来解决我的问题,但它在运行时不起作用。

我希望我能正确解释我的问题。最好的问候。

1 个答案:

答案 0 :(得分:2)

包含守卫是关键:

#ifdef KEYBOARD_INPUT
DGL::Keyboard kbd;
#endif

...

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