/* iアプリ, MIDP でのダブルバッファリングと乱数のテスト Time-stamp: "2005/10/27 Thu 08:29 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://www.a.math.ryukoku.ac.jp/~hig/course/juniors_2005/04/ */ #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif import java.util.Random; // Random クラスを使う #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,0,0 #define MYWHITE 255,255,255 #define MYBLUE 0,0,255 #define MYRED 255,0,0 #define MYGREEN 0,255,0 #define MYYELLOW 255,255,0 #define MYMAGENTA 255,0,255 #define MYCYAN 0,255,255 #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #endif /** IApplication または MIDlet を継承するクラス */ public class RandomSample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ RandomCanvas cc=new RandomCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ RandomCanvas cc = new RandomCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} // V/EZアプリを終了させるためのメソッド public void destroyApp(boolean unconditional) throws MIDletStateChangeException {} // destroyApp は protected なのでラップする void terminate(){ try { destroyApp(false); notifyDestroyed(); } catch( MIDletStateChangeException e ){} } #endif } /** Canvas を継承するクラス. Thread の run プロセスを持つため, implements Runnable */ class RandomCanvas extends Canvas implements Runnable #ifdef MIDP , CommandListener #endif { RandomSample parent; private int x1=0,y1=10; // 黒い四角形の座標 private int x2=50, y2=50; // 青い四角形の座標 private final int w=10,h=10; // 四角形のサイズ private int t=0; private Random r; // 乱数ジェネレータ #ifdef MIDP Command ccanvas; // コマンドキーが押されるイベント #endif /** コンストラクタ. 最初に1回だけ実行される */ RandomCanvas(RandomSample m){ this.parent=m; // 時刻をシードとして初期化 r = new Random( System.currentTimeMillis() );// srand(seed) に相当 // 決り文句. この(this)クラスの run メソッドを平行して走らせる. Thread th = new Thread(this); th.start(); // Canvas でのソフトキー/コマンドキーの設定 #if DOJA setSoftLabel(Frame.SOFT_KEY_1,"終了"); #elif MIDP ccanvas = new Command("終了", Command.SCREEN,0); addCommand(ccanvas); setCommandListener(this); #endif } public void paint(Graphics g){ g.setColor(MYWHITE); g.fillRect(0,0,getWidth(),getHeight()); // 画面を消す g.setColor(MYBLACK); g.fillRect(x1,y1,w,h); g.setColor(MYBLUE); g.fillRect(x2,y2,w,h); } /** スレッドが start されると このメソッドに制御が移る */ public void run(){ while(true){ // 無限ループ x1=(x1+5) % getWidth(); x2=r.nextInt(); // x2=rand() に相当. x2 は -2^31+1 < x2 < 2^31 x2=x2 % 128; // 0 - 127 の範囲に入れる. // x2 = x2 & 0x7f; // こう書いてもだいたい同じ. t++; // 決り文句. ループの回る速さを決める try { Thread.sleep(100); // 10ミリ秒休む. } catch ( Exception e ) { // 割り込みがあっても何もしない. } // x 座標が変化したら描き直す. repaint(); } } // ソフトキー/コマンドキーによる終了 #ifdef DOJA public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT ){ switch( param ){ case Display.KEY_SOFT1://ソフトキー1で終了 parent.terminate(); break; default: } } } #elif MIDP // キャンバスの時およびフォームの時のコマンドキー public void commandAction(Command cx, Displayable s){ if( cx==ccanvas ){ parent.terminate(); } } #endif } /* Local Variables: mode: java End: */