/* iアプリ, MIDP の Canvas クラスでのキーイベント処理の例 Time-stamp: "2003/10/31 Fri 20:09 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://sparrow.math.ryukoku.ac.jp/~hig/course/juniors_2003/03/ */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** Canvas の例(イベント処理あり) */ public class CanvasKeySample extends MIDlet { /** 起動するときに呼ばれる メソッド. 必須. */ public void startApp (){ MyKeyCanvas mc = new MyKeyCanvas(this); Display.getDisplay(this).setCurrent(mc); } /* 以下は, 空でも定義しておくことが必要 */ public void pauseApp(){} public void destroyApp(boolean unconditional){} /* 自分で好きなだけメソッドを定義してよい */ } /** Canvas を用いたグラフィックス */ class MyKeyCanvas extends Canvas implements CommandListener // このクラスでコマンドイベントを処理 { /** コンストラクタ. 配列の初期化のみ行う */ public MyKeyCanvas(MIDlet ap){ this.parent=ap; // これは樋口の癖. 必須ではない. for(int i=0; i < keyname.length; i++){ keyname[i]= "" + unknown; } for(int i=0; i < gameactionname.length; i++){ gameactionname[i]= "ゲ" + unknown; } keyname[KEY_NUM0]="0"; // = getKeyName(KEY_NUM0) なら短く書ける keyname[KEY_NUM1]="1"; keyname[KEY_NUM2]="2"; keyname[KEY_NUM3]="3"; keyname[KEY_NUM4]="4"; keyname[KEY_NUM5]="5"; keyname[KEY_NUM6]="6"; keyname[KEY_NUM7]="7"; keyname[KEY_NUM8]="8"; keyname[KEY_NUM9]="9"; keyname[KEY_STAR]="*"; keyname[KEY_POUND]="#"; gameactionname[UP]="ゲ↑"; gameactionname[DOWN]="ゲ↓"; gameactionname[LEFT]="ゲ←"; gameactionname[RIGHT]="ゲ→"; gameactionname[FIRE]="ゲFIRE"; gameactionname[GAME_A]="ゲGAME_A"; gameactionname[GAME_B]="ゲGAME_B"; gameactionname[GAME_C]="ゲGAME_C"; gameactionname[GAME_D]="ゲGAME_D"; commandname[0]="コ0"; commandname[1]="コ1"; commandname[2]="コ2"; commandname[3]="コ3"; commandname[4]="コ4"; // コマンドキーを登録. 第1引数は画面表示ラベル, 最後の引数は優先順位 for(int i=0; i 0 && action < gameactionname.length ){ msg += gameactionname[action] +" "; } if( keyCode > 0 && keyCode < keyname.length ){ msg += keyname[keyCode]; } else { msg += getKeyName(keyCode); } msg += pressed; repaint(); } /** ゲームアクション, キー が離されたとき */ protected synchronized void keyReleased(int keyCode){ int action=getGameAction(keyCode); msg=""; if( action > 0 && action < gameactionname.length ){ msg += gameactionname[action] +" "; } if( keyCode > 0 && keyCode < keyname.length ){ msg += keyname[keyCode]; } else { msg += getKeyName(keyCode); } msg += released; repaint(); } /** ゲームアクション, キー が押されたままのとき */ protected synchronized void keyRepeated(int keyCode){ int action=getGameAction(keyCode); msg=""; if( action > 0 && action < gameactionname.length ){ msg += gameactionname[action] +" "; } if( keyCode > 0 && keyCode < keyname.length ){ msg += keyname[keyCode]; } else { msg += getKeyName(keyCode); } msg += repeated; repaint(); } /** コマンドイベント */ public void commandAction(Command c, Displayable s){ msg=""; msg += c.getLabel(); msg += pressed; repaint(); } String msg=""; // 何かで初期化しておかないと. // キーの名称をいれておく配列 // keyCode は Unicode に合せているため, 35-57 に分布. private static final String[] keyname=new String[58]; // ゲームアクション名 1-12 に分布 private static final String[] gameactionname=new String[32]; private final int maxcommand=5; private final String[] commandname=new String[maxcommand]; private Command[] c = new Command [maxcommand]; private String pressed="が押された"; private String released="が離された"; private String repeated="が押されたまま"; private String unknown="が関係する不明な動作"; private String unknownkey="不明"; MIDlet parent; // この Canvas を呼び出したクラス } /* Local Variables: mode: java compile-command: "make -k PLAT=MIDP CanvasKeySample.java" End: */