/* iアプリ, MIDP での Thread によるアニメーション Time-stamp: "2004/10/13 Wed 20:18 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://sparrow.math.ryukoku.ac.jp/~hig/course/juniors_2004/03/ */ import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** IApplication または MIDlet を継承するクラス */ public class ThreadAnimSample extends MIDlet { /** 起動するときに呼ばれる メソッド. 必須. */ public void startApp(){ ThreadCanvas cc = new ThreadCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} } /** Canvas を継承するクラス. Thread の run プロセスを持つため, implements Runnable */ class ThreadCanvas extends Canvas implements Runnable { MIDlet parent; private int x1=0,y1=10; // 黒い四角形の座標 private int x2=50, y2=50; // 青い四角形の座標 private final int w=10,h=10; // 四角形のサイズ private int t=0; /** コンストラクタ. 最初に1回だけ実行される */ ThreadCanvas(MIDlet m){ this.parent=m; // 決り文句. この(this)クラスの run メソッドを平行して走らせる. Thread th = new Thread(this); th.start(); // ここでも何かできる. } public void paint(Graphics g){ // 特定の座標に, im[0] または im[0] を貼る. g.setColor(( (255<<16) + (255<<8) + (255)) ); g.fillRect(0,0,getWidth(),getHeight()); // 画面を消す g.setColor(0 ); g.fillRect(x1,y1,w,h); g.setColor(( (0<<16) + (0<<8) + (255)) ); g.fillRect(x2,y2,w,h); g.drawString("" + x1 + " " + t,0,getHeight() ,Graphics.LEFT|Graphics.BOTTOM ); } /** スレッドが start されると このメソッドに制御が移る */ public void run(){ while(true){ // 無限ループ x1=(x1+5) % getWidth(); t++; // 決り文句. ループの回る速さを決める try { Thread.sleep(10); // 10ミリ秒休む. } catch ( Exception e ) { // 割り込みがあっても何もしない. } // x 座標が変化したら描き直す. repaint(); } } /** 以下は最初は気にしなくてよい */ /** ゲームアクション, キー が押されたとき */ protected synchronized void keyPressed(int keyCode){ } /** ゲームアクション, キー が離されたとき */ protected synchronized void keyReleased(int keyCode){ int action=getGameAction(keyCode); if ( action==UP ){ y1--; } else if ( action==DOWN ){ y1++; } repaint(); } /** ゲームアクション, キー が押されたままのとき */ protected synchronized void keyRepeated(int keyCode){ // これは検出しない. } } /* Local Variables: mode: java End: */