Canvas クラスでのキーの検出

目次 携帯Javaのページ

最後の更新は次の時刻以降のはず. Time-stamp: "2002/11/21 Thu 09:48"

Canvas クラスの processEvent(int type, int param) に通知されるので, これをオーバーライドします.

/*
  Canvas での Key 入力をうけとる例他
  2002/10/24 
 */


import com.nttdocomo.ui.*;

/**
   Canvas での Key 入力をうけとる例のクラス
 */
public class CanvasKeySample1 extends IApplication {

    /** 起動するときに呼ばれる メソッド. 必須. */
    public void start(){
	MyCanvasWithKey mc=new MyCanvasWithKey();
	Display.setCurrent(mc);
    }

}

/** */
class MyCanvasWithKey extends Canvas {

    /** コンストラクタ. 配列の初期化のみ行う */
    MyCanvasWithKey(){
	eventname[Display.KEY_PRESSED_EVENT]="が押された";
	eventname[Display.KEY_RELEASED_EVENT]="が離された";

	for(int i=0; i < 0x1f; i++){
	    keyname[i]="名前不明" + i;
	}

	keyname[Display.KEY_0]="0";
	keyname[Display.KEY_1]="1";
	keyname[Display.KEY_2]="2";
	keyname[Display.KEY_3]="3";
	keyname[Display.KEY_4]="4";
	keyname[Display.KEY_5]="5";
	keyname[Display.KEY_6]="6";
	keyname[Display.KEY_7]="7";
	keyname[Display.KEY_8]="8";
	keyname[Display.KEY_9]="9";
	keyname[Display.KEY_ASTERISK]="*";
	keyname[Display.KEY_DOWN]="↓";
	keyname[Display.KEY_LEFT]="←";
	keyname[Display.KEY_UP]="↑";
	keyname[Display.KEY_RIGHT]="→";
	keyname[Display.KEY_POUND]="#";
	keyname[Display.KEY_SELECT]="選択";

	// 以下は Panel のときと異なる.
	keyname[Display.KEY_SOFT1]="ソフトキー1";
	keyname[Display.KEY_SOFT2]="ソフトキー2";
	
	setSoftLabel(Frame.SOFT_KEY_1, "ソ1");
	setSoftLabel(Frame.SOFT_KEY_2, "ソ2");
   }	

    /** 描画するメソッド. repaint で繰り返し呼び出される */
    public void paint(Graphics g){
	g.clearRect(0,0,getWidth(),getHeight());
	g.drawString(msg,0,20);	// 文字列 msg を x,y 座標の位置に描く
    }

    /** 
	何かイベントが起きる(例. キーが押される)と呼び出されるメソッド 
	type がイベントの種類
    */
    public void processEvent(int type, int param){
	msg=keyname[param] + eventname[type];
	repaint();
    }

    String msg="";		// 何かで初期化しておかないと.
    private static final String[]  keyname=new String[0x1f];
    private static final String[]  eventname=new String[2];
}

/* 
   Local Variables:
   mode: java
   End:
*/


これを利用して, アニメーションを開始, 停止する例を書いてみましょう

/*
  Canvas での Key 入力をうけとる例他
  2002/11/14 Thu 10:35
 */


import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;

/**
   Canvas での Key 入力をうけとる例のクラス
 */
public class CanvasKeySample2 extends IApplication {

    /** 起動するときに呼ばれる メソッド. 必須. */
    public void start(){
	AnimWithKey mc=new AnimWithKey();
	Display.setCurrent(mc);

	Timer ti=new Timer();
	ti.setTime(1000);	// 1000ミリ秒で発生するタイマー
	ti.setRepeat(true);	// 繰り返し発生するタイマー
	ti.setListener(mc);	// クラス mc の timerExpired を使用.
	ti.start();		// カウントダウン開始. 一時停止は, ti.stop();
    }

}

/** */
class AnimWithKey extends Canvas implements TimerListener {

    /** コンストラクタ. 配列の初期化のみ行う */
    AnimWithKey(){
	setSoftLabel(Frame.SOFT_KEY_1, "停止");
	setSoftLabel(Frame.SOFT_KEY_2, "終了");
	inAnimation=true;


	im=new Image[2];

	MediaImage mi0=MediaManager.getImage("resource:///pose0.gif");
	MediaImage mi1=MediaManager.getImage("resource:///pose1.gif");

	try{

	    mi0.use();
	    im[0]=mi0.getImage();

	    mi1.use();
	    im[1]=mi1.getImage();

	} catch (Exception e){

	    //"gif を貼ることに失敗"

	}

   }	

    /** 描画するメソッド. repaint で繰り返し呼び出される */
    public void paint(Graphics g){
	// 特定の座標に, im[0] または im[1] を貼る.
	g.clearRect(0,0,getWidth(),getHeight());// 画面を消す
	g.drawImage(im[t],getWidth()/3,getHeight()/4); // 絵を貼る
    }


    /** Timer が 0 になったとき呼ばれるメソッド
	implements TimerListner を宣言したらこれが必要 */
    public void timerExpired(Timer source){ 
	if(inAnimation){
	    t= (t+1) % 2;		// 時間を進め
	}
	repaint();		// paint() を再度呼び出す.
    }
    
    /** 
	何かイベントが起きる(例. キーが押される)と呼び出されるメソッド 
	type がイベントの種類
    */
    public void processEvent(int type, int param){
	if( type==Display.KEY_PRESSED_EVENT ){
	    if (param==Display.KEY_SOFT1 && inAnimation){
		inAnimation=false;
		setSoftLabel(Frame.SOFT_KEY_1, "開始");
	    } else if( param==Display.KEY_SOFT1 &&  !inAnimation ){
		inAnimation=true;
		setSoftLabel(Frame.SOFT_KEY_1, "停止");
	    } else if ( param==Display.KEY_SOFT2){
		IApplication.getCurrentApp().terminate();
	    }
	}
    }



    private Image im[];
    private int t=0;
    private boolean inAnimation;

}

/* 
   Local Variables:
   mode: java
   End:
*/


実は getKeypadState() メソッドを使うと, 2個以上の key の同時押しも検出できます.

課題

自分の描いたキャラクターのgif画像が, 適当なキーを押すと上下左右に移動して描かれるアニメーションを作ろう. さらに, 向きが変わる, 変身する, ボールを投げるなどの機能を加えよう.
Copyright © 2002-2003 Saburo Higuchi. All rights reserved.
樋口三郎, http://www.math.ryukoku.ac.jp/~hig/ hig mail address