/* ImageMapによるマップの一方向スクロール描画テスト1 2011/05/01 創作プログラミングの街 */ import com.nttdocomo.ui.*; import java.io.*; import java.util.*; class testCanvas extends Canvas implements Runnable { // ImageMapのチップ画像 private Image[] chip; // マップ(チップ配置)情報 private byte[] map; // ImageMapオブジェクト private ImageMap imap; // チップサイズ private static final int CHIP_WIDTH = 20; private static final int CHIP_HEIGHT = 20; // 画面上に表示する範囲(チップ数) private static final int VIEW_COLS = 11; private static final int VIEW_ROWS = 11; // マップ全体の大きさ private static final int MAP_COLS = 20; private static final int MAP_ROWS = VIEW_ROWS; // 描画座標 private static final int MAP_DRAW_X = 10; private static final int MAP_DRAW_Y = 10; // ImageMapを描画するImage private Image screen; // マップ上の現在位置 private int x_pos; // メイン処理スレッド private Thread thread; // 現在のスクロール量 private int scroll_pos; public void init() { Random rnd = new Random(); int i, j; int r, g, b; // Image作成用のピクセルデータ配列 int[] pixels = new int[CHIP_WIDTH * CHIP_HEIGHT]; // チップ画像の配列を作成 chip = new Image[4]; // チップ0(赤)のピクセルデータ作成 for (i = 0;i < CHIP_WIDTH * CHIP_HEIGHT;i++) { pixels[i] = ((224 + (rnd.nextInt() & 0x1f)) << 16) | 0x00002020; } // チップ0作成 chip[0] = Image.createImage(CHIP_WIDTH, CHIP_HEIGHT, pixels, 0); // チップ1(緑)のピクセルデータ作成 for (i = 0;i < CHIP_WIDTH * CHIP_HEIGHT;i++) { pixels[i] = ((224 + (rnd.nextInt() & 0x1f)) << 8) | 0x00200020; } // チップ1作成 chip[1] = Image.createImage(CHIP_WIDTH, CHIP_HEIGHT, pixels, 0); // チップ2(青)のピクセルデータ作成 for (i = 0;i < CHIP_WIDTH * CHIP_HEIGHT;i++) { pixels[i] = (224 + (rnd.nextInt() & 0x1f)) | 0x00202000; } // チップ2作成 chip[2] = Image.createImage(CHIP_WIDTH, CHIP_HEIGHT, pixels, 0); // チップ3(灰)のピクセルデータ作成 for (i = 0;i < CHIP_WIDTH * CHIP_HEIGHT;i++) { pixels[i] = 0x00e0e0e0; } // チップ3作成 chip[3] = Image.createImage(CHIP_WIDTH, CHIP_HEIGHT, pixels, 0); // マップ情報配列作成 map = new byte[MAP_COLS * MAP_ROWS]; // 乱数でマップ情報を設定 for (i = 0;i < MAP_COLS * MAP_ROWS;i++) { map[i] = (byte)(rnd.nextInt() & 3); } // ImageMap作成 imap = new ImageMap(CHIP_WIDTH, CHIP_HEIGHT, MAP_COLS, MAP_ROWS, map, chip); // スクロール初期設定 x_pos = 0; scroll_pos = 0; // ImageMap可視範囲(横方向1チップ分広く)設定 imap.setWindow(x_pos, 0, VIEW_COLS + 1, VIEW_ROWS); // スクロール描画用Image作成 screen = Image.createImage(CHIP_WIDTH * VIEW_COLS, CHIP_HEIGHT * VIEW_ROWS); } public void start() { thread = new Thread(this); // スクロール開始 thread.start(); } public void run() { while (true) { // スクロール量更新、1チップ分スクロールが終了したら次のスクロールへ if (++scroll_pos >= CHIP_WIDTH) { // マップ端まで来たら終了 if (x_pos == MAP_COLS - VIEW_COLS - 1) { break; } // スクロール量変数クリア scroll_pos = 0; // 現在位置を1つ右へ x_pos++; // ImageMapの可視範囲を新たなスクロール範囲に更新 imap.setWindow(x_pos, 0, VIEW_COLS + 1, VIEW_ROWS); } // 現在のスクロール状態を描画 repaint(); // ウエイトを入れる try { Thread.sleep(30); } catch (Exception e) { } } } public synchronized void paint(Graphics g) { g.lock(); // ImageMapをスクロール量だけずらしてImageに描画 screen.getGraphics().drawImageMap(imap, -scroll_pos, 0); // スクロール状態を描画したImageを画面に表示 g.drawImage(screen, MAP_DRAW_X, MAP_DRAW_Y); g.unlock(true); } } public class imagemapTest1 extends IApplication { private testCanvas cv; public void start() { cv = new testCanvas(); cv.init(); Display.setCurrent(cv); cv.start(); } }