2021年1月28日 星期四

OIS 輸入設備程式庫

跨平台輸入設備程式庫,包含鍵盤 滑鼠 搖桿 觸控 ,支援 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) 關掉。









沒有留言:

張貼留言