我编写了一个运行良好的事件处理程序机制。所以我将它扩展为更通用并编写了一个事件处理程序来给我键盘状态:
class KeybdHandler : public EventHandler<KeybdHandler>
{
private:
Keyboard _keybd;
public:
void SetEvent( const Keyboard::KeyEvent & evt )
{
Keyboard::KeyEvent e = evt;
// event holds the new keystate
Notify(&e);
// keystate is saved to keyboard
_keybd.SetKey(e._Key, e._bKeyDown);
}
Keyboard & GetKeybd() { return _keybd; }
};
static KeybdHandler g_evtKeybd;
KeybdHandler::Keyboard 变量包含一个表示键盘状态的数组(例如,每个键一个条目和表示 keydown 或 keyup 的 bool 变量)。
所以我创建了这个 KeybdHandler 类的静态实例。
但是当我调用 g_evtKeybd.GetKeybd() 时,键盘状态始终为空/空白/全部处于 keyup 状态。
当我将 KeybdHandler::Keyboard 变量设为静态时,GetKeybd() 返回一个已保存状态的键盘对象。
如果包含对象是静态的,为什么 Keyboard 变量必须是静态的?
编辑:只是想澄清 SetEvent 总是通过静态变量调用:
g_evtKeybd.SetEvent( Keyboard::KeyEvent((int)key, true));
EDIT2:我不确定它是否相关。KeybdHandler 类位于静态库中,并链接到另一个可执行文件。