跨平台輸入設備程式庫,包含鍵盤 滑鼠 搖桿 觸控 ,支援 cmake 編譯
到 Releases · wgois/OIS · GitHub 抓取,我取得時是 1.5 版
看一下 demos\OISConsoleDemo 子目錄中的範例大概就知道的怎麼用,以下摘錄範例的 Win 平台做簡要說明
// OIS 的 buffered 模式事件處理程序,這裡加了 鍵盤 滑鼠 搖桿
// 依自己須要 override 所須事件虛擬函數
class EventHandler : public KeyListener, public MouseListener,
public JoyStickListener
{
// 鍵盤按下時的事件
bool keyPressed(const KeyEvent& arg) override
{
std::cout << " KeyPressed {" << std::hex << arg.key << std::dec
<< "} || Character (" << (char)arg.text << ")" << std::endl;
if(arg.key == OIS::KeyCode::KC_UP)
{
std::cout << "up key!\n";
}
return true;
}
}handler;
main()
{
hWnd = // 產生一個 Win 視窗
// ParamList 是一個 std::multimap<std::string, std::string>
ParamList pl;
std::ostringstream wnd;
wnd << (size_t)hWnd;
// 把要給 OIS 的視窗代號放在 pl
pl.insert(std::make_pair(std::string("WINDOW"), wnd.str()));
// 產生 OIS
g_InputManager = InputManager::createInputSystem(pl);
//Lets enable all addons that were compiled in:
g_InputManager->enableAddOnFactory(InputManager::AddOn_All);
// 產生代表鍵盤的的物件
g_kb = (Keyboard*)g_InputManager->createInputObject(OISKeyboard, true);
// 設定鍵盤的事件處理程序
g_kb->setEventCallback(&handler);
/* ---
看範例如何產生其他輸入物件,概念上和產生鍵盤物件
意思一樣
--- */
// 訊息廻圈
while(appRunning)
{
MSG msg;
while(PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/*--- 每項輸入設備都要處理一次才會獲得最新狀態 ---/
// 取得鍵盤狀態
if(g_kb)
{
g_kb->capture();
if(!g_kb->buffered()) // 是否關閉鍵盤的 buffered 模式
handleNonBufferedKeys();
}
/*--- 其它輸入設備也要處理,參見範例 ---/
}
}OIS 的輸入設備 buffered 模式為 true 時才會叫用 handler 事件處理程序,否則得自行再寫處理程式,如上例中的 handleNonBufferedKeys()。
以鍵盤來說有沒有 buffered 的差別在按下按鍵時,系統會不斷送出按鍵訊息,若有 buffered 只會呼叫 handler 事件處理程序一次,若你想要自己檢查鍵盤狀態,可用 g_kb->setBuffered(false) 關掉。
沒有留言:
張貼留言