NaCl tips; pp::Instance に通知されるビュー変化イベント、フォーカスイベント
初めは固定分解能のビューを前提にしようかと思っていた。しかしどうやらビュー変化をイベントで受ける仕組みがPepperのNaClインスタンスには標準で実装されているらしい。と、云うことはゲーム世界の情報を3Dで空間的に作るのであれば、OpenGL ES 2.0もある事ですし、当初からフレキシブルなビューという事で設計してしまった方が楽だと思う。
と、言う訳で、
- View Change, Focus, and Input Events - Native Client — Google Developers
- pp::Instance Class Reference - Native Client — Google Developers
など参考にNaClの実装テストを進めているLabyrinthianのビューをフレキシブルに・・・、と言ってもまだ描画周りを実装していないので単にビュー変化のイベントを受け取るpp::Instanceを継承したNaClインスタンスにDidChangeView、ついでにDidChangeFocusのオーバーライドを実装して仮にメッセージングでToDoを記述したのみだけど。
先にメッセージング周りとデバッグログ出力っぽい事は実装してあるので、PostMessageすればJSに届いてコンソールにとりあえずなログが残る。テスト用にDidChangeViewの2つのオーバーロードは一応両方呼んである。
pp::Instance::DidChangeViewには2つのオーバーロード:
- (const pp::View&)
- (const pp::Rect&, const pp::Rect&)
があって、pp::View型については、
と定義されている。View型の持つ情報の内、GetRect/GetClipRectメンバー関数で得られる情報のみを扱えれば良い場合は後者を使っておけば良い、と。なお、View型は他にIsFullscreen/IsVisible/IsPageVisibleメンバー関数を持っている。
ついでのついで、Full-HDを前提とした固定サイズのビューのCSSを任意の分解能に対応する様に変更もしておいた。
ついでのついでのついで、pp::Instance::DidChangeFocusについてもToDoで実装しておいた。フォーカスが剥がれると全自動でポーズするか否かはプレイヤーのコンフィグに任せるとしても、そういう機能は実装しておきたい気がしているし、そんな感じのToDoをとりあえずは書いておいた。
何れもChromium-dev20でテストしてみたところ、NaClモジュールのembedのリサイズに応じてDidChangeView、NaClモジュールのembedのクリックによってDidChangeFocusが発生する事を確認できた。ただ、DidChangeFocusについては予想通りではない挙動があり、フォーカスのロスト時に呼ばれていない模様なのが気になっている。これはまあToDoを実装する段階になってから色々と試してみようかと思う。
なお、今日はNaClはせっかくウェブブラウザーによるHTML文書構造と非常に連携しやすいプラットフォームなので、例えば会話ウィンドウやステータスウィンドウはメッセージングしてHTMLで出してみようかとか考えて見たことを試すなどもしていたのだけれど、どうもフォントレンダリング周りがHTML/CSSは不安定だったり、エフェクトやトランジットを考えるとすべてNaClでやった方がいいのかなーとかそういう感じに・w・;
次はNaClが標準搭載しているAudio周りの機能について確認しようと思います。