コールアンドマジック製品版では、アンドロイドやiOSなどのモバイルデバイスだけではなく、PCやPSVitaでのリリースも予定している。
モバイルからPCや携帯ゲーム機に移植する際におそらく一番大変なのは、インターフェースの変更だと思う。
スマホだとタッチ操作のインターフェースだけでも、特に違和感は感じないというか、スマホには基本的にタッチスクリーンしかないため、それが自然だ。
けれども、PCやPSVitaになると、カーソルキーやアナログスティック、キーボードやボタンが備わっているわけで、それらを一切使えないというのは、やはりどうしても違和感を感じてしまう。
PCだとタッチできるスクリーンのほうがまだ少ないだろうし。
タッチ操作を物理キー入力に置き換える(もしくは同時にサポートする)には、いろいろ面倒な問題がある。
たとえば、画面上のオブジェクトを直接タッチできていたところを、カーソルキーやアナログスティックで置き換えるには、カーソルキーやアナログスティックでフォーカスして、スペースキーやボタンでアクションを発生させるなど、二段階のアクションが必要になる。
なので、コールアンドマジック製品版では、はじめからPCでの入力にも対応できるつくりとする。
具体的には、タッチ入力は今までどおりタッチされるオブジェクト側でOnMouseEnterなどで対処する。
同時にキーボードなど物理入力を受け取るシングルトンのコントローラーオブジェクトを用意する。
このコントローラーは、各種のキー入力に対応する処理が関数ポインタとなっていて、必要なキー入力に対応する関数を、画面を構築する際に(初期化処理時などに)構成する、という仕組みだ。
たとえば、Hit Any Keyのような入力ならこうなる。
void Update () { if (!listen) { return; } …中略… if (Input.anyKeyDown) { listen = false; //①関数ポインタの呼び出し if(funcOnAnyKeyDown(this)) return; } …中略… }
上記ソースの①funcOnAnyKeyDownは関数ポインタのFunc<param, retVal>を使用している。
初期化時には、何も処理をしないダミーの関数が指定されている。
キー入力に対して処理をフックしたければ、対応する関数ポインタで上書きする。
この様にキー入力の最初の受け取りを一箇所に絞ることで、決定ボタンの二重送信の防止などの制御もやりやすくなるはずだ。