/* オブジェクト指向/マルチスレッド Time-stamp: "2004/11/03 Wed 11:13 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://sparrow.math.ryukoku.ac.jp/~hig/course/juniors_2004/05/ */ //#define DOJA //#define MIDP #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif import java.util.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 #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 /** マルチスレッドのサンプル */ public class MThreadSample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ MThreadCanvas cc=new MThreadCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ MThreadCanvas cc = new MThreadCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif } /** キャンバスを継承するクラス */ class MThreadCanvas extends Canvas implements Runnable { MThreadSample parent; private int width; private int height; Man m0; Square s0, s1; /** コンストラクタ. 最初に1回だけ実行される */ MThreadCanvas(MThreadSample m){ this.parent=m; width=getWidth(); height=getHeight(); /* 人を作る */ m0=new Man(width/2, height/2); Thread thm=new Thread(m0); thm.start(); /* 正方形を作る */ s0=new Square(width/2, height/10,2); s1=new Square(width/2, height/4,8); Thread ths0=new Thread(s0); Thread ths1=new Thread(s1); ths0.start(); ths1.start(); /* このクラスの run に制御を移す */ Thread th=new Thread(this); th.start(); } public void run(){ while(true){ // 無限ループ // 決り文句. ループの回る速さを決める try { Thread.sleep(300); } catch ( Exception e ) { // 割り込みがあっても何もしない. } repaint(); } } public void paint(Graphics g){ g.setColor(MYWHITE); g.fillRect(0,0,width,height); // 画面を消す // 各オブジェクトの描画メソッドに任せる m0.paint(g); s0.paint(g); s1.paint(g); } #if DOJA /** キーイベントを拾う */ public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT ){ switch( param ){ case Display.KEY_UP: m0.moveUp(); break; case Display.KEY_DOWN: m0.moveDown(); break; case Display.KEY_LEFT: m0.moveLeft(); break; case Display.KEY_RIGHT: m0.moveRight(); break; default: } } } #elif MIDP /** ゲームアクション, キー が押されたとき */ protected synchronized void keyPressed(int keyCode){ int action=getGameAction(keyCode); switch ( action ){ case UP: m0.moveUp(); break; case DOWN: m0.moveDown(); break; case LEFT: m0.moveLeft(); break; case RIGHT: m0.moveRight(); break; default: } } /** ゲームアクション, キー が離されたとき */ protected synchronized void keyReleased(int keyCode){ // これは検出しない. } /** ゲームアクション, キー が押されたままのとき */ protected synchronized void keyRepeated(int keyCode){ // これは検出しない. } #endif } class Man implements Runnable { private Image [] im; private int x; private int y; private int t; Man(int x, int y){ // 変数の初期化 this.x=x; this.y=y; this.t=0; // イメージの読み込み im=new Image[2]; #if DOJA MediaImage mi0=MediaManager.getImage("resource:///pose0.gif"); MediaImage mi1=MediaManager.getImage("resource:///pose1.gif"); #elif MIDP #endif try{ #if DOJA mi0.use(); im[0]=mi0.getImage(); mi1.use(); im[1]=mi1.getImage(); #elif MIDP im[0]=Image.createImage("/pose0.png"); im[1]=Image.createImage("/pose1.png"); #endif } catch (Exception e){ //"gif を読み込むことに失敗" } } /** スレッドが start されると このメソッドに制御が移る */ public void run(){ while(true){ // 無限ループ t=(t+1)%2; // 決り文句. ループの回る速さを決める try { Thread.sleep(500); } catch ( Exception e ) { // 割り込みがあっても何もしない. } } } public void paint(Graphics g){ g.drawImage(im[t],x,y MYALIGN); // 絵を貼る } public void moveUp(){ y-=5; } public void moveDown(){ y+=5; } public void moveLeft(){ x-=5; } public void moveRight(){ x+=5; } } class Square implements Runnable { private int size=5; private int x; private int dx; private int y; Random r; Square(int x, int y, int dx){ this.x=x; this.y=y; this.dx=dx; r = new Random( System.currentTimeMillis() +x + y + dx); } /** スレッドが start されると このメソッドに制御が移る */ public void run(){ while(true){ // 無限ループ y=(y+1)%100; if((r.nextInt() & 0x4) == 0x4){ x=(x+dx)%100; } else { x=(x-dx+100)%100; } // 決り文句. ループの回る速さを決める try { Thread.sleep(1000); } catch ( Exception e ) { // 割り込みがあっても何もしない. } } } public void paint(Graphics g){ g.setColor(MYBLACK); g.fillRect(x,y,size,size); // 4角形を描く } } /* Local Variables: mode: java End: */