Javaプログラミング/サーバサイド&ケータイJava

Canvasクラスを更に使いこなす

今回は、Canvasのイメージ表示やイベント処理について理解し、簡単なパズルゲーム作りに挑戦してみましょう。

執筆者:掌田 津耶乃

Canvasのイベント処理


Canvasでは、コンポーネントのたぐいは一切使えません。基本的には、描画だけですべての表示を作成することになります。基本的に、CanvasはFrameなどと比べると非常にシンプルな作りになっているのです。

となると、イベント処理はどのようになるのでしょうか。実をいえば、Canvasには、何らかのイベント処理を行うためのイベントリスナーを組み込む機能などはまったくありません。そのような便利な機能はないのです。Canvasに用意されているのは、もっと低レベルの機能のみです。

Canvasには、何らかのイベントが発生すると呼び出されるメソッドが用意されています。「processEvent」というもので、Canvasで何かのイベントが発生すればすべてこのメソッドが呼ばれます。したがって、このメソッドの使い方さえ理解していれば、Canvasのイベント処理は比較的簡単です。

では、イベント処理を利用した簡単なサンプルを作成してみましょう。前回と同様、SampleIAppから、MainCanvasクラスを呼び出す形で作成をしておきます。

import com.nttdocomo.ui.*;

public class SampleIApp extends IApplication {

  public void start() {
    Display.setCurrent(new MainCanvas(this));
  }
}

class MainCanvas extends Canvas {
  IApplication iapp;
  int[][] data;
  int x,y;
  
  MainCanvas(IApplication app){
    super();
    this.iapp = app;
    data = new int[][]{
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0},
        {0,0,0,0,0}};
    this.setSoftLabel(Frame.SOFT_KEY_1, "NEW");
    this.setSoftLabel(Frame.SOFT_KEY_2, "QUIT");
  }
  
  public void init(){
    for(int i = 0;i < 5;i++)
      for(int j = 0;j < 5;j++)
        data[i][j] = 1;
    x = 2;
    y = 2;
    data[x][y] = 2;
    this.repaint();
  }
  
  public void change(){
    data[x][y] = 0;
    this.repaint();
  }
  
  public void move(int dx,int dy){
    data[x][y] = data[x][y] == 2 ? 1 : data[x][y];
    int x0 = x;
    int y0 = y;
    x = x + dx;
    y = y + dy;
    x = x < 0 ? 0 : x;
    x = x > 4 ? 4 : x;
    y = y < 0 ? 0 : y;
    y = y > 4 ? 4 : y;
    if (data[x][y] == 0){
      x = x0;
      y = y0;
    }
    data[x][y] = 2;
    this.repaint();
  }
  
  public void paint(Graphics g) {
    g.lock();
    g.setColor(Graphics.getColorOfRGB(255, 255, 255));
    g.fillRect(0, 0, 250, 250);
    for(int i = 0;i < 5;i++)
      for(int j = 0;j < 5;j++){
        switch(data[i][j]){
        case 0:
          g.setColor(Graphics.getColorOfRGB(255, 255, 255));
          g.fillRect(i * 30, j * 30, 30, 30);
          break;
        case 1:
          g.setColor(Graphics.getColorOfRGB(0, 0, 255));
          g.fillArc(i * 30, j * 30, 30, 30, 0, 360);
          break;
        case 2:
          g.setColor(Graphics.getColorOfRGB(255, 0, 0));
          g.fillArc(i * 30, j * 30, 30, 30, 0, 360);
          break;
        }
      }
    g.unlock(true);
  }

  public void processEvent(int type, int param) {
    super.processEvent(type, param);
    switch(type){
    case Display.KEY_PRESSED_EVENT:
      switch(param){
      case Display.KEY_SOFT1:
        init();
        break;
      case Display.KEY_SOFT2:
        iapp.terminate();
        break;
      case Display.KEY_UP:
        move(0,-1);
        break;
      case Display.KEY_DOWN:
        move(0,1);
        break;
      case Display.KEY_RIGHT:
        move(1,0);
        break;
      case Display.KEY_LEFT:
        move(-1,0);
        break;
      case Display.KEY_SELECT:
        change();
      }
    }
  }
  
}



  • 1
  • 2
  • 3
  • 5
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます