オープンアプリ・ゲームコンテスト
コンテスト概要 応募方法 応募作で遊ぼう アプリ開発講座 Special Special

アプリ開発講座

講座スケジュール
第1回 オープンアプリ(Java)とJava実行環境
line
第2回 はじめてのオープンアプリ(Java)の作成
line
第3回 イメージの描画
line
第4回 キー入力の処理
line
第5回 オープンアプリ(Java)への移植
line
第6回 ゲームの作成
line
第7回 端末へのデータ保存
line
第8回 サウンドの再生
line
第9回 バイブレーションとブラウザ起動
line 最終回 HTTPによる通信
line

開発講座TOPへ



講師プロフィール
株式会社ユビキタスエンターテインメント 布留川英一

1999年のJavaMEの仕様公開を期に「JAVA PRESS(技術評論社)」にてライターとしての活動をはじめ、2000年の503iシリーズの発売を期にドワンゴへ移り、携帯アプリの研究開発を行う。2005年に独立し、ユビキタスエンターテインメントにて次世代コンテンツを作成中。
【著書】
MIDP 2.0 携帯Javaアプリ開発ハンドブック
iアプリゲーム開発テキストブック
ActionScript 3.0 ゲームプログラミングブック
他6冊

 

 

第4回 
キー入力の処理


第4回の今回は、方向キーによってキャラクターを動かすプログラムを作ります。決定キーで中央の位置に戻ります。ソフトキーでキャラクターの速度を変更することもできます(初期状態のエミュレータでは、ソフトキーでなく、メニュー形式で表示されます)。
[サンプルプログラムのダウンロード]



プログラムは、次の2つのクラスで構成されています。

  • KeyExクラス(KeyEx.java)
  • KeyCanvasクラス(KeyCanvas.java)

プロジェクト名とクラス名「KeyEx」でプロジェクトを作成してください。

画像ファイルの準備

今回使用する画像ファイルは次の1枚です。プロジェクトのresフォルダ(C:\WTK22\apps\KeyEx\res)に置いてください。

・kero.png 48x48ピクセル



KeyExクラス

KeyExクラスはプログラムの本体となるクラスです。

KeyEx.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

//キー入力の処理(本体)
public class KeyEx extends MIDlet {

    //コンストラクタ
    public KeyEx() {
        //キャンバスの指定
        KeyCanvas c=new KeyCanvas();
        Display.getDisplay(this).setCurrent(c);

        //スレッドの実行
        (new Thread(c)).start();
    }

    //アプリの開始
    public void startApp() {
    }

    //アプリの一時停止
    public void pauseApp() {
    }

    //アプリの終了
    public void destroyApp(boolean flag) {
    }
}

KeyCanvasクラス

KeyCanvasクラスはキャンバスとなるクラスです。

import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.util.*;

//キー入力の処理(キャンバス)
class KeyCanvas extends GameCanvas 
    implements Runnable,CommandListener {
    private int       keyEvent=-999;         //キーイベント
    private int       keyState;              //キー状態
    private Command[] command=new Command[2];//コマンド
    private int       x=120-24;              //X座標
    private int       y=120-24;              //Y座標
    private int       speed=5;               //速度

    //コンストラクタ
    KeyCanvas() {
        //キーイベントの抑制
        super(false);
    }

    //実行
    public void run() {
        //グラフィックスの取得
        Graphics g=getGraphics();

        //画像ファイルの読み込み
        Image image=null;
        try {
            image=Image.createImage("/kero.png");
        } catch (Exception e) {
            System.out.println(e.toString());
        }

        //コマンドの生成
        command[0]=new Command("速",Command.SCREEN,0);
        command[1]=new Command("遅",Command.SCREEN,1);

        //コマンドの追加
        addCommand(command[0]);
        addCommand(command[1]);

        //コマンドリスナーの指定
        setCommandListener(this);

        while (true) {
            //キーイベントの処理
            if (keyEvent==FIRE) {
                x=120-24;
                y=120-24;
            }
            keyEvent=-999;

            //キー状態の処理
            keyState=getKeyStates();
            if ((UP_PRESSED   &keyState)!=0) y-=speed;//上キー
            if ((DOWN_PRESSED &keyState)!=0) y+=speed;//下キー
            if ((LEFT_PRESSED &keyState)!=0) x-=speed;//左キー
            if ((RIGHT_PRESSED&keyState)!=0) x+=speed;//右キー

            //描画
            g.setColor(255,255,255);
            g.fillRect(0,0,getWidth(),getHeight());
            g.drawImage(image,x,y,Graphics.LEFT|Graphics.TOP);
            flushGraphics();
            
            //スリープ
            try {
                Thread.sleep(50);
            } catch (Exception e) {
            }
        }
    }

    //キープレスイベント
    public void keyPressed(int keyCode) {
        if (keyCode==0) return;
        switch(getGameAction(keyCode)) {        
        case FIRE:keyEvent=FIRE;break;//選択キー
        }
    }

    //コマンドイベント
    public void commandAction(Command c,Displayable disp) {
        if (c==command[0]) speed=10;
        if (c==command[1]) speed=5;
        repaint();
    }
}



◎キーイベントの処理
キーイベントは方向キーや数字キーを押したり離したりする時に発生するイベントです。キーを押すと実機からkeyPressed()メソッドが、キーを押し続けると繰り返しkeyRepeated()メソッドが、キーを離すとkeyReleased()メソッドが呼ばれます。

[Canvasクラス]
void keyPressed(keyCode)

keyCode キーコード:int型
キーを押した時に実機から呼ばれる。

[Canvasクラス]
void keyRepeated(keyCode)

keyCode キーコード:int型
キーを押し続けている時に実機から呼ばれる。

[Canvasクラス]
void keyReleased(keyCode)

keyCode キーコード:int型
キーを離した時に実機から呼ばれる。

数字キーと記号キー(#と*)が押された時は、次の定数がKeyCode引数で渡されます。

Canvas.KEY_NUM0 0キー
Canvas.KEY_NUM1 1キー
Canvas.KEY_NUM2 2キー
Canvas.KEY_NUM3 3キー
Canvas.KEY_NUM4 4キー
Canvas.KEY_NUM5 5キー
Canvas.KEY_NUM6 6キー
Canvas.KEY_NUM7 7キー
Canvas.KEY_NUM8 8キー
Canvas.KEY_NUM9 9キー
Canvas.KEY_POUND #キー
Canvas.KEY_STAR *キー

方向キーと決定キーは、キーコードをCanvasクラスのgetGameAction()メソッドに渡して得られる値「ゲームアクション」によってどのキーが押されたかを判断します。ゲームアクションが割り当てられている数字キーもあります。

[Canvasクラス]
int getGameAction(keyCode)

keyCode キーコード:int型
戻り値 ゲームアクション:int型
ゲームアクションを取得する。

Canvas.UP 上キー
Canvas.DONW 下キー
Canvas.LEFT 左キー
Canvas.RIGHT 右キー
Canvas.FIRE 決定キー
Canvas.GAME_A ゲームA
Canvas.GAME_B ゲームB
Canvas.GAME_C ゲームC
Canvas.GAME_D ゲームD

ゲームA・ゲームB・ゲームC・ゲームDの4つのキーは機種依存キーですが、オープンアプリ(Java)では1・3・7・9キーとなります。クリアキーを押した時のキーコード(0)をgetGameAction()メソッドに渡すと例外が発生する機種もあるので、値を渡す前にチェックしたほうが良いでしょう。

また、数字キーを方向キー・決定キーとしても判定するので(2:上,4:左,6:右,8:下,5:決定)、数字キーとして使いたい時は方向キーより先に判定するようにしてください。


◎キー状態の取得
「キーイベント」がボタンを押したり離したりするたびに処理を行うのに対し、「キー状態」は、現在どのキーが押されているかを取得して、それに応じた処理を行います。つまり、キーを押した直後に何かやりたい時は「キーイベント」を使い、キーが押されている限り何かやり続ける時は「キー状態」を使います。キー状態を取得できるのは「方向キー」「決定キー」です。数字キーは方向キー・決定キーとして判定されます。

「キー状態」を取得するには、GameCanvasクラスのgetKeyStates()メソッドを使います。

[GameCanvasクラス]
int getKeyStates()

戻り値 キー状態:int型
キー状態を取得する。

戻り値は次の定数を同時押しした数だけ|でつなげた値です。

GameCanvas.UP_PRESSED 上キー
GameCanvas.DOWN_PRESSED 下キー
GameCanvas.LEFT_PRESSED 左キー
GameCanvas.RIGHT_PRESSED 右キー
GameCanvas.FIRE_PRESSED 決定キー
GameCanvas.GAME_A_PRESSED ゲームA
GameCanvas.GAME_B_PRESSED ゲームB
GameCanvas.GAME_C_PRESSED ゲームC
GameCanvas.GAME_D_PRESSED ゲームD

特定のキーが押されているかどうかは、キー状態の値とGameCanvasクラスで定義されている定数の値を&で計算して0になるかどうかでわかります。

上キーが押されているかどうかを調べるには、次のように記述します。

if ((UP_PRESSED&keyState)!=0) 処理;

コマンドイベントを処理する

コマンドはアプリの上端または下端に表示されるメニュー項目のことです。メニューがどのようなインタフェースになるかは機種依存になります。オープンアプリ(Java)では画面下端のソフトキーとして表示されます。

コマンドを生成するには、Commandクラスを使います。

[Commandクラス]
Command(label,type,priority)
label ラベル:String型
type コマンド種別:int型
priority 優先度:int型
Commandクラスのコンストラクタ。

ラベルにはメニュー項目として表示する文字列を指定します。表示できる文字列の長さは機種依存で、全角2文字にしておくのが無難です。コマンド種別は種類を識別するためだけのもので、BACKを指定したら前画面に戻るというわけではありません。基本的にCommand.SCREENを指定しておけば良いでしょう。

Command.BACK バック
Cinnabd.CANCEL キャンセル
Command.HELP ヘルプ
Command.ITEM アイテム
Command.SCREEN スクリーン
Command.STOP ストップ

優先度は値の大きさに応じてメニュー項目の配置順番が変わります。

コマンドをアプリに追加するには、Canvasクラスの親クラスであるDisplayableクラスのaddCommand()メソッドを使います。

[Displayableクラス]
void addCommand(command)

command Commandオブジェクト:Command型
Commandクラスのコンストラクタ。

メニュー項目を選択するとコマンドイベントが発生し、CommandListenerのcommandAction()メソッドに通知します。

今回は、KeyCanvasクラス自身にCommandListenerインタフェースを実装します。次にDisplayableクラスのsetCommandListener()メソッドで、イベント発生をどこへ通知すればよいかを指定します。

[Displayableクラス]
void setCommandListener(listener)

listener リスナー:CommandListener型
ソフトキーが押された時の通知先を指定する。

最後に通知先となるcommandAction()メソッドを実装します。

[CommandListenerインタフェース]
void commandAction(Command c,Displayable disp)

c イベント発生元となるCommandオブジェクト:Command型
disp イベント発生元となるDisplayableオブジェクト:Displayable型
ソフトキーが押された時の通知先。

おわりに

今回はこれでおしまいです。次回はiアプリやS!アプリからの「オープンアプリ(Java)への移植」について解説します。


ページ先頭へ


  Copyright(C) Spicysoft Corporation All rights reserved.
 
アプリゲット