龍谷大学> 理工学部> 数理情報学科> Team539> 樋口三郎> 担当科目> 2007 年> iアプリ/S!アプリ/オープンアプリを作ろうプロジェクト---数理情報演習>第 03 回

Canvas のキーイベント / Thread によるアニメーション

[目次|前回|次回|携帯Javaのページ|ローカルドキュメント]
Time-stamp: "2007-10-11 Thu 13:23 JST hig"

キーイベント

Canvas に制御されている状態で, 人間がキーを押した場合に, それに反応してアプリに何かさせることを考えましょう.

アプリが他の処理を行っている途中でも, キーが押されたり離されたりした(イベントが発生した)ときには割り込みが発生し,

このイベントハンドラのなかで, Canvas クラスの void repaint(Graphics g) メソッドを呼ぶと, そのときの変数の値に応じて Canvas クラスの void paint(Graphics g) メソッドが再度実行されて画面が描き直されます.

このことを用いて, 特定のイベントが発生したときに, 文字列を表示するプログラムのサンプル KeyEventSample を示します.

さらに, 任意のイベントが発生したときに, その内容を文字列で説明するプログラムのサンプル CanvasKeySample を示します.

以上のサンプルは, 機能を示すために作成した不自然なものなので, これを改造して何か作ろうとしないほうがいいかもしれません.

なお, DoJa では Canvas クラスの int getKeypadState() メソッドを使うと, 2個以上の key の同時押しも検出できます.

アニメーション

アニメーション(Canvas に描かれる内容が時間とともに変化する) には, Thread を使うのが普通です.

サンプル ThreadAnimSample.javaを見てみましょう.

なお, Thread を使うと, 描画に時間がかかるようになってくると動きが鈍くなるような場合があります. 駒落ちしてもいいから時間を厳密に再現したい場合には, 後で説明する Timer クラスを使うという方法もあります.

プログラムの基本形

キー入力を伴う, アニメーションの基本形はこんな感じ?
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();
    }

}

課題

時間とともに, 画面の上を何かが移動していくようなアニメーションを作ろう. キー入力に反応してなにか変化するようにしよう.