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が必要だった事に気づくのにちょっとかかった笑