【制作実習】コントローラの抽象化

コールアンドマジック製品版では、アンドロイドや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>を使用している。

初期化時には、何も処理をしないダミーの関数が指定されている。

キー入力に対して処理をフックしたければ、対応する関数ポインタで上書きする。

この様にキー入力の最初の受け取りを一箇所に絞ることで、決定ボタンの二重送信の防止などの制御もやりやすくなるはずだ。

5年前

コメントを残す

メールアドレスが公開されることはありません。