C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

NaCl tips; 入力イベントを捉える

NaClではPepper APIでキーボードやマウスからの入力の面倒を見てくれる。(JavaScriptで受けてメッセージングで飛ばすなんてダサい事は必要ないよ!やったね!!)

ポイントは2つ。

  • pp::Instance::RequestInputEvents/pp::Instance::RequestFilteringInputEventsでNaClインスタンスが入力イベントを受け取る様にしとく。
    • 前者はマウス、後者はキーボードのイベントを拾いたい場合に使う。
  • pp::HnadleInputEventで受ける。(その後必要ならswitchで振り分けるとかする)

source

  • .cxx / Request
    explicit Labyrinthian_instance(PP_Instance a): pp::Instance(a){
      RequestInputEvents(
        PP_INPUTEVENT_CLASS_MOUSE |
        PP_INPUTEVENT_CLASS_WHEEL
      );
      RequestFilteringInputEvents(
        PP_INPUTEVENT_CLASS_KEYBOARD
      );
    }
  • .cxx / pp::HandleInputEvent
    virtual bool HandleInputEvent(const pp::InputEvent& event){
      PostMessage(pp::Var("HandleInputEvent"));
      std::cerr << "HandleInputEvent\n";
      auto m = std::string(
          "Test: input / handle input event\n"
          "  type: "
          );
      m += boost::lexical_cast<std::string>(event.GetType()) + "\n"
        "  time: " + boost::lexical_cast<std::string>(event.GetTimeStamp());
      PostMessage(m);
      return pp::Instance::HandleInputEvent(event);
    }

commit

test

執筆現在のLabyrinthian - Wonder Rabbit Projectはこのコミットが適用された状態のものなので、JavaScriptコンソールを覗きながらマウスを動かしたりキーを操作すると:

[1336027654649:on_message]  Test: input / handle input event
  type: 4
  time: 502339.8112821579 
wrp_nacl

みたいにメッセージングされたログを確認できます。(デプロイしてるLabyrinthianでいつまでこのコミットが残った状態かはさておき)

実際にはここから、 pp::InputEvent::GetType でswitchしてpp::InputEventをpp::MouseInputEvent/pp::WheelInputEvent/pp::KeyboardInputEventのコンストラクターに渡して対応したい処理を記述する。Pepper_19のexampleのInput Eventのソースは良い参考資料になります。

キーボードのイベントも通常のキーのdown/upはもちろん(リピート中もdownは発生し続ける)、修飾キーのdownは通常のキーとは別のtypeが割り当てられていたり、マウスも座標がとれたり、ゲームに要求される判定にも十分な感じですね。

蛇足
  • 今回はハンドラーのパラメーターで受け取った中身も表示。そこんところにstd::to_string使おうかと思ったら執筆現在のnacl-g++は4.4系なので未実装だった→boost::lexical_castるか→newlibロケールで死ぬポ→glibcに、とかちょっと回り道がありました。
  • ドキュメントの読みが脳内で全自動はしょりんぐされてpp::HandleInputEventをオーバーライドするだけでいいのよね?とか思ってしまっていてRequestが必要だった事に気づくのにちょっとかかった笑