オブジェクト指向/マルチスレッド

[目次|前回|次回|携帯Javaのページ|ローカルドキュメント]
Time-stamp: "2006-10-25 Wed 16:41 JST hig"

ダブルバッファリング

iアプリでのアニメーションの画面のちらつきを防ぐには, 結論としては, DoubleBufferSample.javaのように, paint メソッドで, iアプリの場合
void paint(Graphics g){
  g.lock();
  // g に対して fillRect などを実行
  g.unlock(true);		
}
なぜでしょう? このようにしたときと, しなかったときを比べてみましょう. Vアプリ/EZアプリの場合 自動的に対策がダブルバッファリングがされており, ちらつきません. 実際, DoubleBufferSample.java で, doDoubleBufferingByHand を true にしても false にしても表示の様子には 変化がありません.

プログラムの基本形

キー入力を伴う, アニメーションの基本形はこんな感じ?
import パッケージ1;
import パッケージ2;

public class MyApplication extends IApplicationまたは MIDlet {

    public void start() または startApp(){
	ThreadCanvas cc=new MyCanvas(this);
	Display.setCurrent(cc);または Display.getDisplay(this).setCurrent(cc);
    }


    public void pauseApp(){}
    public void destroyApp(boolean unconditional){}


}

class MyCanvas extends Canvas implements Runnable 必要に応じて他にも {

    MyApplication parent;

    型 クラス変数1; //画面を表現するのに必要十分な変数
    型 クラス変数2;

    /** コンストラクタ. 最初に1回だけ実行される */
    MyCanvas(MyApplication m){
	this.parent=m;
        クラス変数の初期化;
    }

    public void paint(Graphics g){
	クラス変数の値に応じて g に絵を描く;
    }

    /* これがあるので implements Runnable と宣言できる */
    /* 100ミリ秒に1回,  クラス変数が自動的に変化する */
    public void run(){
	while(true){ // 無限ループ

	    クラス変数を変化させる;

	    try {
		Thread.sleep(100); // 100ミリ秒休む.
	    } catch ( Exception e ) {
		// 割り込みがあっても何もしない.
	    }

	    repaint();
	}
    }

    public void processEvent(int type, int param)または void keyPressed/keyReleased/keyRepeated(int keyCode){
	キー param/KeyCodeに, イベント type が発生したときに, クラス変数の値を変更;

	repaint();
    }

}

オブジェクト指向/マルチスレッド

これまでは, 必要最低限の2つのクラス(IApplication/MIDletを継承するクラス, Canvasを継承するクラス)を使用してアプリを作ってきました.

オブジェクト指向では, 1種類の ものに対して1個のクラスを定義し, 1個のものに対して1個のオブジェクトを作ります. クラスは, データメンバー(オブジェクトの内部状態)とメソッド(オブジェクトが外部に与えるサービス)を持ちます.

このような意味で, オブジェクト指向で書いたプログラム MThreadSample.javaと, 最小の2個のクラスで書いたプログラム MThreadSample.javaと, を示します. いずれも, 前回使用した画像 pose0.gif/png, pose1.gif/png が必要です.

課題

2種類のキャラに対応する, implements Runnable な2つのクラスを作ろう. それぞれの run() で特徴の異る動きを記述しよう. これらの Thread を作ってアニメーションしよう. また, それぞれのキャラには自分の描いた jpg/png/gif 画像を使おう.