第8回 キーボードに合わせてグラフィックを動かす

ゲームでは,キャラクターをキーボード操作に合わせて動かす必要がある(必ずしもそうではないが,たいていある)。今回はiアプリのゲームでキーボードを読み取る方法を説明しよう。

【国内記事】 2001年3月9日 更新

キーボードを読み取るには

 グラフィックはCanvasというオブジェクトを使い描画するということを第6回で紹介した。Canvasはゲームでの利用を考慮して作られたNTTドコモのライブラリで,キーボードの読み取りは「低レベルイベント処理」を使って行うようになっている。

 低レベルイベント処理なんていうと難しそうだが,「前処理をしていない状態のイベント処理」という風に理解すればいい。

 Canvasを作成してiモードの画面に表示すると,そのCanvasに対して発生したイベント──たとえばユーザーがキーを押したとか,タイマーイベントが発生したといったイベントが起こると,そのイベントが全部,CanvasのprocessEvent()というメソッドに送られる仕組みになっている。プログラマがprocessEvent()を上書きして,そこにキーボードイベントを読み取って何かをする……本稿の主題ならグラフィックを動かすという手続きを書けばいい。

 たとえば,次のような具合である。

class MyCanvas extends Canvas {

  MyCanvas() {
    ...ここでGIFデータを読み取ったり
    する。第6回を参照。
  }

  public void paint(Graphics g) {
    ここでGIFを描画したりする
    第6回参照
  }

  public void processEvent(int type,
                           int param ) {

    ここにキーボードイベントがやって来る
    キーボードに合わせて絵を動かそう!
  }
}

 Canvasには,キーボードの状態を読み取るgetKeypadState()というメソッドが用意されている。上のprocessEvent()メソッドの中で,getKeypadState()を呼び出して,今,ユーザーが押したキーを知ることができる。

 getKeypadState()で読み取れるキーコードは,NTTドコモが供給しているAPIガイドの13ページに記されているが,少し分かりづらいかもしれないので後のリストも参考にして欲しい。

落とし穴がいっぱい

 ここまで分かれば,あとは簡単そう……と思う人もいると思うが,そう甘くはない。

 プレーヤーがキーを押し続けるならキャラクターも動き続けるように作るのが普通だ。一方,キーボードイベントはキーを押したときと離したときにしか発生しない。単純にprocessEvent()の中でgetKeypadState()を使ってキーを読み取るだけにしておくと,プレーヤーがキーを連打しないとキャラクターを動かせない,ということになってしまい,ユーザーからクソゲーの汚名を着せられそうだ。

 キーを押し続けるのに合わせてキャラクターを動かすには,キーを常に読み取る仕組みが必要で,それにはタイマーを使う。Canvasには便利なShortTimerという簡単に使えるユーティリティクラスが用意されている。

 ShortTimerで,Canvasに対してインターバルタイマー(指定した間隔で常に発生するタイマー)とワンショットタイマー(指定した時間の後に発生したら,それで終る1度きりのタイマー)が利用できる。となれば,インターバルタイマーを使ってキーを読み取ろう,と誰もが考えると思う。筆者もそう考えた。

 しかし,インターバルタイマーは,ちょっとしたタイミングで簡単に止まってしまう仕様なので注意が必要だ。どういうタイミングで止まるか詳しいことは筆者もよく分からないのだが,とにかく止まってしまうので扱いに困る。

 確実に止まらないようにするには,ワンショットタイマーを使い,イベントが起こるたびにタイマーをスタートさせてキーボードを繰り返し読むという方法がいいようだ。

 また,タイマー解像度(機種によって異なる)を下回るタイマー時間を設定すると,まともに動かないことがあるので,その点にも注意して欲しい。タイマー解像度を取り出すgetResolution()というメソッドがあるが,このメソッドはShortTimerを作った後でないと使えない。一方,ShortTimerは作成時にタイマー時間を設定しなければならない。

 一体,どうすればいいっていうんだ? と言いたくもなるが,仕様だから仕方がない。ダミーのタイマーを作成してタイマー解像度を得て,それから本物のShortTimerを作るという方法も考えられるが,いたずらにプログラムサイズを増やす可能性もある。一応,今のところ100ミリ秒以上を設定しておけば,たいていは大丈夫のようなので,そうしておけばいい。

 さて,以上のような知識を総動員して作ったサンプルをリスト1に示そう。総動員しても,たったこれだけのリストでOKだ。このリストは,Jarアーカイブに収めたnya.GIFという画像を,携帯の上下左右キーに合わせて画面上で動かすサンプルだ。http://gadget.mda.or.jp/i/ImageDemo.htmlからダウンロードできるので試してみてほしい。

お詫びと訂正
 いくつかタイプミスによる誤りがあり,読者からご指摘いただいた。お詫びとともに訂正させていただきたい。

第6回のサンプルリスト内】

誤)  public void paint(Graphcs g) {
正)  public void paint(Graphics g) {

第5回のpreverifyの環境設定の中でCLASSPATHの内容 】

誤)C:\i-jade-p\classes;.;
正)C:\i-jade\classes;.;

関連記事
▼iアプリ最速は“今のところ”N503i──ベンチマーク結果
▼503iのベンチマーク結果をどう読むか?
▼503iの詳細なベンチマーク結果公開──スパイシーソフト
▼iアプリの互換性は大丈夫なのか?
▼携帯電話はPCと逆方向に進化する?
▼503iの「速さ」をベンチマークテスト──意外な速度差が
▼ドコモ,Java搭載iモード端末503i発表──1月26日発売
▼iモード対応Javaを作るのに必要なものは?──NTTドコモ,仕様をついに公開
▼制限きついiモード用Java──ドコモ503iでできること,できないこと
▼Java搭載iモードではこんなことができる!──ドワンゴ「サムライ ロマネスク」
▼iモードのJava端末,当初はロースペックで登場

[米田 聡,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!