|
|
第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)への移植」について解説します。 |