イメージマップの利用


では、このサンプルを「イメージマップ」という機能を使って作成してみましょう。今回は、非常にシンプルになりますよ。

class MainCanvas extends Canvas {
  private int[] data;
  ImageMap map;

  MainCanvas() {
    setSoftLabel(SOFT_KEY_1, "END");
    setBackground(Graphics.getColorOfName(Graphics.WHITE));
    data = new int[]{
        2,2,2,2,3,0,0,
        2,2,3,3,3,3,3,
        2,2,3,0,0,0,1,
        2,0,3,0,0,1,1,
        0,0,3,0,1,1,1,
        0,0,3,0,1,1,1,
        0,0,3,0,0,1,1
    };
    try {
      MediaImage mi =MediaManager.getImage("resource:///images.jpg");
      mi.use();
      Image img = mi.getImage();
      Image[] arr = new Image[]{img};
      map = new ImageMap(25,25,7,7,data,arr,true);
    }catch(Exception e){}
  }

  public void paint(Graphics g) {
    g.lock();
    g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
    g.drawImageMap(map,10,10);
    g.unlock(true);
  }

  public void processEvent(int type, int param) {
    switch(type){
    case Display.KEY_RELEASED_EVENT:
      switch(param){
      case Display.KEY_SOFT1:
        (IApplication.getCurrentApp()).terminate();
        break;
      }
      break;
    }
  }

}


今回は、修正した「MainCanvas」クラスのソースコードだけ抜粋して掲載しておきました。これでも、プログラムを実行すれば、先ほどのiアプリと全く同じ表示が現れます。

ここでは、「ImageMap」というクラスを作成しています。この部分ですね。

map = new ImageMap(25,25,7,7,data,arr,true);

このImageMapは、ずいぶんとたくさんの引数が指定されています。これらを整理すると、こんな感じになります。

new ImageMap(マップの横幅,縦幅,横の個数,縦の個数,int配列,Image配列,boolean);

ImageMapでは、表示するマップ1個の大きさ、縦横に並べる個数、表示する番号をまとめたint配列、表示用のImage配列などを引数に指定します。最後にbooleanが1つありますが、これは「イメージが1つ1つ別のImageとして用意されいるか、それとも1つのImageにまとめられているか」を示します。

これらの引数を指定すれば、後は、ただImageMapの場所を指定するだけです。paintで描画している部分を見てください。

g.drawImageMap(map,10,10);

たったこれだけ。ImageMapインスタンスを作るに引数を細かく指定する面倒はありますが、描画の簡単さを考えると、2次元マップ表示にこれを利用しない手はありませんね!