/* オブジェクト指向/マルチスレッド Time-stamp: "2005/10/27 Thu 08:30 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 1 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Random; /** マルチスレッドのサンプル */ public class MThreadSample extends MIDlet { /** 起動するときに呼ばれる メソッド. 必須. */ public void startApp(){ MThreadCanvas cc = new MThreadCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} } /** キャンバスを継承するクラス */ 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(255,255,255); g.fillRect(0,0,width,height); // 画面を消す // 各オブジェクトの描画メソッドに任せる m0.paint(g); s0.paint(g); s1.paint(g); } /** ゲームアクション, キー が押されたとき */ 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){ // これは検出しない. } } 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]; try{ im[0]=Image.createImage("/pose0.png"); im[1]=Image.createImage("/pose1.png"); } 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 ,Graphics.LEFT|Graphics.BOTTOM); // 絵を貼る } 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(0,0,0); g.fillRect(x,y,size,size); // 4角形を描く } } /* Local Variables: mode: java End: */