/* iアプリ, MIDP での Thread によるアニメーション Time-stamp: "2003/10/30 Thu 17:07 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://sparrow.math.ryukoku.ac.jp/~hig/course/juniors_2003/05/ */ import com.nttdocomo.ui.*; import java.util.*; // Random を使う /** IApplication または MIDlet を継承するクラス */ public class ThreadAnimSample extends IApplication { /** 起動するときに呼ばれる メソッド. 必須. */ public void start(){ ThreadCanvas cc=new ThreadCanvas(this); Display.setCurrent(cc); } } /** Canvas を継承するクラス. Thread の run プロセスを持つため, implements Runnable */ class ThreadCanvas extends Canvas implements Runnable { IApplication parent; private int x,y=10; // 黒い四角形の座標 private int xr,yr=50; // 青い四角形の座標 private final int w=10,h=10; // 四角形のサイズ private Random r; // 乱数ジェネレータ /** コンストラクタ. 最初に1回だけ実行される */ ThreadCanvas(IApplication m){ this.parent=m; r = new Random( System.currentTimeMillis() ); //時刻で初期化. Thread th = new Thread(this); th.start(); // ここでも何かできる. setSoftLabel(Frame.SOFT_KEY_1, "ソ1"); setSoftLabel(Frame.SOFT_KEY_2, "ソ2"); } public void paint(Graphics g){ // 特定の座標に, im[0] または im[0] を貼る. g.setColor(Graphics.getColorOfName(Graphics.WHITE) ); g.fillRect(0,0,getWidth(),getHeight()); // 画面を消す g.setColor(Graphics.getColorOfName(Graphics.BLACK) ); g.fillRect(x,y,w,h); g.setColor(Graphics.getColorOfName(Graphics.BLUE) ); g.fillRect(xr,yr,w,h); g.drawString("" + xr,0,getHeight() +0 ); } /** スレッドが start されると このメソッドに制御が移る */ public void run(){ while(true){ // 無限ループ x=(x+5) % getWidth(); xr=r.nextInt(); // xr は -2^31+1 < xr < 2^31 xr = xr & 0x7f; // 下7桁を使うと 128 までになる. // 本当はこのほうが趣味よい. 2^24 で割って, プラスに // xr=(xr >> 24) & 0x7f; try { Thread.sleep(1000); // 1000ミリ秒休む. } catch ( Exception e ) { // 割り込みがあっても何もしない. } repaint(); } } } /* Local Variables: mode: java End: */