/* 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/ */ #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif #if DOJA #elif MIDP #else // DoJa/MIDP Builder を使われる方へ: // まず, プログラムの先頭で, #define DOJA // などと定義する必要があります. // 以下の define 文は, #if - #endif の中に書かれていますので, // DoJa/MIDP Builder のプリプロセッサでは処理できません. // そこで, #if - #endif はやめて, // いらない方をJava の意味でコメント文にしてください. #endif #if DOJA #define MYALIGN +0 #define MYAP IApplication #define MYSTART start #define MYBLACK Graphics.getColorOfName(Graphics.BLACK) #define MYWHITE Graphics.getColorOfName(Graphics.WHITE) #define MYBLUE Graphics.getColorOfName(Graphics.BLUE) #define MYRED Graphics.getColorOfName(Graphics.RED) #define MYGREEN Graphics.getColorOfName(Graphics.GREEN) #define MYYELLOW Graphics.getColorOfName(Graphics.YELLOW) #define MYMAGENTA Graphics.getColorOfName(Graphics.MAROON) #define MYCYAN Graphics.getColorOfName(Graphics.AQUA) #define MYDIALOG Dialog #define MYLABEL Label #define MYADD add #define MYTEXT Text #elif MIDP #define MYALIGN ,Graphics.LEFT|Graphics.BOTTOM #define MYAP MIDlet #define MYSTART startApp #define MYBLACK 0 #define MYWHITE ( (255<<16) + (255<<8) + (255)) #define MYBLUE ( (0<<16) + (0<<8) + (255)) #define MYRED ( (255<<16) + (0<<8) + (0)) #define MYGREEN ( (0<<16) + (255<<8) + (0)) #define MYYELLOW ( (255<<16) + (255<<8) + (0)) #define MYMAGENTA ( (255<<16) + (0<<8) + (255)) #define MYCYAN ( (0<<16) + (255<<8) + (255)) #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #endif /** Canvas の例(イベント処理あり) */ public class CanvasKeySample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ public void MYSTART(){ MyKeyCanvas mc = new MyKeyCanvas(this); #if DOJA Display.setCurrent(mc); #elif MIDP Display.getDisplay(this).setCurrent(mc); #endif } #if MIDP /* 以下は, 空でも定義しておくことが必要 */ public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif /* 自分で好きなだけメソッドを定義してよい */ } /** Canvas を用いたグラフィックス */ class MyKeyCanvas extends Canvas #ifdef MIDP implements CommandListener // このクラスでコマンドイベントを処理 #endif { /** コンストラクタ. 配列の初期化のみ行う */ public MyKeyCanvas(MYAP ap){ this.parent=ap; // これは樋口の癖. 必須ではない. #ifdef DOJA for(int i=0; i < keyname.length; i++){ keyname[i]= "" + unknownkey + i; } keyname[Display.KEY_0]="0"; keyname[Display.KEY_1]="1"; keyname[Display.KEY_2]="2"; keyname[Display.KEY_3]="3"; keyname[Display.KEY_4]="4"; keyname[Display.KEY_5]="5"; keyname[Display.KEY_6]="6"; keyname[Display.KEY_7]="7"; keyname[Display.KEY_8]="8"; keyname[Display.KEY_9]="9"; keyname[Display.KEY_ASTERISK]="*"; keyname[Display.KEY_DOWN]="↓"; keyname[Display.KEY_LEFT]="←"; keyname[Display.KEY_UP]="↑"; keyname[Display.KEY_RIGHT]="→"; keyname[Display.KEY_POUND]="#"; keyname[Display.KEY_SELECT]="選択"; keyname[Display.KEY_SOFT1]="ソフトキー1"; //Panel のときと異なる. keyname[Display.KEY_SOFT2]="ソフトキー2"; //Panel のときと異なる. // ソフトキーのラベルを表示する. setSoftLabel(Frame.SOFT_KEY_1, "ソ1"); setSoftLabel(Frame.SOFT_KEY_2, "ソ2"); eventname[Display.KEY_PRESSED_EVENT]=pressed; eventname[Display.KEY_RELEASED_EVENT]=released; #else MIDP 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(); } #endif String msg=""; // 何かで初期化しておかないと. // キーの名称をいれておく配列 #ifdef DOJA private static final String[] keyname=new String[0x1f]; // イベントの名称をいれておく配列 private static final String[] eventname=new String[2]; #elif MIDP // 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]; #endif private String pressed="が押された"; private String released="が離された"; private String repeated="が押されたまま"; private String unknown="が関係する不明な動作"; private String unknownkey="不明"; MYAP parent; // この Canvas を呼び出したクラス } /* Local Variables: mode: java compile-command: "make -k PLAT=MIDP CanvasKeySample.java" End: */