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