/* オブジェクト指向/マルチスレッド シングルスレッドに書き直したもの Time-stamp: "2005/11/08 Tue 10:43 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 SThreadSample extends MIDlet { /** 起動するときに呼ばれる メソッド. 必須. */ public void startApp(){ SThreadCanvas cc = new SThreadCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} } /** キャンバスを継承するクラス */ class SThreadCanvas extends Canvas implements Runnable { SThreadSample parent; private int width; private int height; private Image [] im; private int mx; private int my; private int mt; private int ssize=5; private int s0x,s0y,s0dx; private int s1x,s1y,s1dx; Random r; /** コンストラクタ. 最初に1回だけ実行される */ SThreadCanvas(SThreadSample m){ this.parent=m; width=getWidth(); height=getHeight(); /* 人を作る */ mx=width/2; my=height/2; mt=0; s0x=width/2; s0y=height/10; s0dx=2; s1x=width/2; s1y=height/4; s1dx=8; r = new Random( System.currentTimeMillis() ); // イメージの読み込み im=new Image[2]; try{ im[0]=Image.createImage("/pose0.png"); im[1]=Image.createImage("/pose1.png"); } catch (Exception e){ //"gif を読み込むことに失敗" } /* このクラスの run に制御を移す */ Thread th=new Thread(this); th.start(); } public void run(){ while(true){ // 無限ループ // 決り文句. ループの回る速さを決める mt=(mt+1)%2; s0y=(s0y+1)%100; s1y=(s1y+1)%100; if((r.nextInt() & 0x4) == 0x4){ s0x=(s0x+s0dx)%100; } else { s0x=(s0x-s0dx+100)%100; } if((r.nextInt() & 0x4) == 0x4){ s1x=(s1x+s1dx)%100; } else { s1x=(s1x-s1dx+100)%100; } try { Thread.sleep(300); } catch ( Exception e ) { // 割り込みがあっても何もしない. } repaint(); } } public void paint(Graphics g){ g.setColor(255,255,255); g.fillRect(0,0,width,height); // 画面を消す g.setColor(0,0,0); g.fillRect(s0x,s0y,ssize,ssize); // 4角形を描く g.fillRect(s1x,s1y,ssize,ssize); // 4角形を描く g.drawImage(im[mt],mx,my ,Graphics.LEFT|Graphics.BOTTOM); // 絵を貼る } /** ゲームアクション, キー が押されたとき */ protected synchronized void keyPressed(int keyCode){ int action=getGameAction(keyCode); switch ( action ){ case UP: my-=5; break; case DOWN: my+=5; break; case LEFT: mx-=5; break; case RIGHT: mx+=5; break; default: } } /** ゲームアクション, キー が離されたとき */ protected synchronized void keyReleased(int keyCode){ // これは検出しない. } /** ゲームアクション, キー が押されたままのとき */ protected synchronized void keyRepeated(int keyCode){ // これは検出しない. } } /* Local Variables: mode: java End: */