RGBの携帯Java入門

 
ソース雛形
ver 1.1
ver 1.2
ver 1.2.1

■バージョン1.1からの主な変更点

  • 中央揃え描画処理の追加
  • setFontメソッドの追加
  • getStringWidthメソッドの追加
  • getStringHeightメソッドの追加
  • keyeventPressedの初期値を-1に変更


  • →iアプリ用はコチラ

    →v/ezアプリ用はコチラ


    ■iアプリ用

    DoJaの Kicker.java
    import com.nttdocomo.ui.*;
    
    /**
     * ゲームの開始処理を行うクラスです。
     *	
     * @author RGB
     * @version 1.2
     */
    public class Kicker extends IApplication {
    	
    	/**
    	 * メインのキャンバスです。
    	 */
    	private MainCanvas mc;
    	
    	
    	/**
    	 * アプリケーションが起動したら呼ばれるメソッドです。
    	 */
    	public void start() {
    		mc = new MainCanvas(this);
    		Display.setCurrent(mc);
    		mc.start();
    	}
    	
    	
    }
    

    DoJaの MainCanvas.java
    import com.nttdocomo.ui.*;
    import com.nttdocomo.io.*;
    import javax.microedition.io.*;
    import java.io.*;
    import java.util.*;
    
    /**
     * メインのキャンバスです。
     *	
     * @author RGB
     * @version 1.2
     */
    public class MainCanvas extends Canvas implements Runnable {
    	
    	// ------------------------------------------------------------------------
    	// 
    	// 共通部:特に変更する必要はありません。
    	// 
    	// ------------------------------------------------------------------------
    	
    	/**
    	 * 使用領域の幅です。
    	 */
    	public static final int AREA_WIDTH = 240;
    	
    	/**
    	 * 使用領域の高さです。
    	 */
    	public static final int AREA_HEIGHT = 240;
    	
    	/**
    	 * 画面の幅です。
    	 */
    	public static final int DISPLAY_WIDTH = Display.getWidth();
    	
    	/**
    	 * 画面の高さです。
    	 */
    	public static final int DISPLAY_HEIGHT = Display.getHeight();
    	
    	/**
    	 * キー処理で使用する定数で、「上キー」を表します。
    	 */
    	public static final int KEY_UP = Display.KEY_UP;
    	
    	/**
    	 * キー処理で使用する定数で、「下キー」を表します。
    	 */
    	public static final int KEY_DOWN = Display.KEY_DOWN;
    	
    	/**
    	 * キー処理で使用する定数で、「右キー」を表します。
    	 */
    	public static final int KEY_RIGHT = Display.KEY_RIGHT;
    	
    	/**
    	 * キー処理で使用する定数で、「左キー」を表します。
    	 */
    	public static final int KEY_LEFT = Display.KEY_LEFT;
    	
    	/**
    	 * キー処理で使用する定数で、「決定キー」を表します。
    	 */
    	public static final int KEY_SELECT = Display.KEY_SELECT;
    	
    	/**
    	 * キー処理で使用する定数で、「0キー」を表します。
    	 */
    	public static final int KEY_0 = Display.KEY_0;
    	
    	/**
    	 * キー処理で使用する定数で、「1キー」を表します。
    	 */
    	public static final int KEY_1 = Display.KEY_1;
    	
    	/**
    	 * キー処理で使用する定数で、「2キー」を表します。
    	 */
    	public static final int KEY_2 = Display.KEY_2;
    	
    	/**
    	 * キー処理で使用する定数で、「3キー」を表します。
    	 */
    	public static final int KEY_3 = Display.KEY_3;
    	
    	/**
    	 * キー処理で使用する定数で、「4キー」を表します。
    	 */
    	public static final int KEY_4 = Display.KEY_4;
    	
    	/**
    	 * キー処理で使用する定数で、「5キー」を表します。
    	 */
    	public static final int KEY_5 = Display.KEY_5;
    	
    	/**
    	 * キー処理で使用する定数で、「6キー」を表します。
    	 */
    	public static final int KEY_6 = Display.KEY_6;
    	
    	/**
    	 * キー処理で使用する定数で、「7キー」を表します。
    	 */
    	public static final int KEY_7 = Display.KEY_7;
    	
    	/**
    	 * キー処理で使用する定数で、「8キー」を表します。
    	 */
    	public static final int KEY_8 = Display.KEY_8;
    	
    	/**
    	 * キー処理で使用する定数で、「9キー」を表します。
    	 */
    	public static final int KEY_9 = Display.KEY_9;
    	
    	/**
    	 * キー処理で使用する定数で、「*キー」を表します。
    	 */
    	public static final int KEY_ASTERISK = Display.KEY_ASTERISK;
    	
    	/**
    	 * キー処理で使用する定数で、「#キー」を表します。
    	 */
    	public static final int KEY_POUND = Display.KEY_POUND;
    	
    	/**
    	* フォントの定数で、「サイズ小」を表します。
    	*/
    	public static final int FONT_SMALL = Font.SIZE_SMALL;
    	
    	/**
    	* フォントの定数で、「サイズ中」を表します。
    	*/
    	public static final int FONT_MEDIUM = Font.SIZE_MEDIUM;
    	
    	/**
    	* フォントの定数で、「サイズ大」を表します。
    	*/
    	public static final int FONT_LARGE = Font.SIZE_LARGE;
    	
    	/**
    	* 描画処理の定数で、「中央揃え」を表します。
    	*/
    	public static final int DRAW_CENTER = Integer.MAX_VALUE;
    	
    	/**
    	 * 押されたキーの値です。
    	 */
    	private int keyeventPressed = -1;
    	
    	/**
    	 * このキャンバスのグラフィックスオブジェクトです。
    	 */
    	private Graphics g = null;
    	
    	/**
    	 * 現在のフレームカウントです。
    	 */
    	private int frameCount = 0;
    	
    	/**
    	* 現在のシーンです。
    	*/
    	private int scene = 0;
    	
    	/**
    	 * シーンの切り替え状態を管理します。
    	 */
    	private boolean sceneSwitch = false;
    	
    	/**
    	 * 設定されたIApplicationオブジェクトです。
    	 */
    	private IApplication kicker;
    	
    	/**
    	 * ゲーム用のスレッドです。
    	 */
    	private Thread th;
    	
    	/**
    	 * キーイベント発生時にtrueとなります。
    	 */
    	private boolean keyeventHappen;
    	
    	/**
    	 * キーリピート開始時のframeCountです。
    	 */
    	private int startRepeatCount;
    	
    	
    	/**
    	 * コンストラクタです。
    	 */
    	public MainCanvas(IApplication kicker) {
    		this.kicker = kicker;
    	}
    	
    	
    	/**
    	* キャンバス処理を開始します。
    	*/
    	public void start() {
    		repaint();
    	}
    	
    	
    	/**
    	* 画面の描画要求時に呼ばれます。
    	*
    	* @param g グラフィックスオブジェクトが渡されます。
    	*/
    	public void paint(Graphics g) {
    		if(th == null) {
    			this.g = g;
    			th = new Thread(this);
    			th.start();
    			Thread.currentThread().yield();
    		}
    	}
    	
    	
    	/**
    	* キーイベント取得メソッドです。
    	*
    	* @param type イベントのタイプが渡されます。
    	* @param param イベントのパラメータが渡されます。
    	*/
    	public void processEvent(int type, int param) {
    		if(type == Display.KEY_PRESSED_EVENT) {
    			keyeventPressed = param;
    		}
    		else if(type == Display.KEY_RELEASED_EVENT) {
    			keyeventPressed = -1;
    			startRepeatCount = 0;
    		}
    		
    		if(keyScene()) {
    			paintScene();
    			keyeventHappen = true;
    		}
    	}
    	
    	
    	/**
    	* 指定されたキーが、押された状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyPressing(int key) {
    		if(keyeventPressed == key) {
    			keyeventPressed = -1;
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* 指定されたキーが、押されっぱなしの状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyContinuing(int key) {
    		if(keyeventPressed == key) {
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* 指定されたキーが、キーリピート状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyRepeating(int key) {
    		if(keyeventPressed == key) {
    			if(startRepeatCount == 0) {
    				startRepeatCount = frameCount;
    				return true;
    			}
    			else if(frameCount - startRepeatCount > 1) {
    				return true;
    			}
    			else {
    				return false;
    			}
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* アプリを終了します。
    	*/
    	public void exit() {
    		IApplication.getCurrentApp().terminate();
    	}
    	
    	
    	/**
    	* 画像を読み込みます。
    	*
    	* @param name 画像名称を設定します。
    	* @return 読み込んだ画像を返します。
    	*/
    	public Image loadImage(String name) {
    		MediaImage mImg = null;
    		Image img = null;
    		try {
    			mImg = MediaManager.getImage("resource:///" + name + ".gif");
    			mImg.use();
    			img = mImg.getImage();
    		} 
    		catch(ConnectionException ce) {
    			if(mImg != null) {
    				mImg.unuse();
    				mImg.dispose();
    			}
    			throw new RuntimeException(ce.getMessage());
    		}
    		return img;
    	}
    	
    	
    	/**
    	* 描画開始時・描画終了時の処理を行います。
    	*
    	* @param state 描画開始はtrue、描画終了はfalseを設定します。
    	*/
    	public void draw(boolean state) {
    		if(state) {
    			g.lock();
    		}
    		else {
    			g.unlock(false);
    		}
    	}
    	
    	
    	/**
    	* 描画に使用する色を設定します。
    	*
    	* @param red 赤要素の輝度を指定します(0〜255)。
    	* @param green 緑要素の輝度を指定します(0〜255)。
    	* @param blue 青要素の輝度を指定します(0〜255)。
    	*/
    	public void setColor(int red, int green, int blue) {
    		g.setColor(Graphics.getColorOfRGB(red, green, blue));
    	}
    	
    	
    	/**
    	* 矩形領域を塗りつぶします。
    	*
    	* @param x 矩形の左上のX座標を指定します。
    	* @param y 矩形の左上のY座標を指定します。
    	* @param width 矩形の幅を指定します。
    	* @param height 矩形の高さを指定します。
    	*/
    	public void fillRect(int x, int y, int width, int height) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - width)/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - height)/2;
    		}
    		
    		g.fillRect(dx, dy, width, height);
    	}
    	
    	
    	/**
    	* 文字列を描画します。
    	*
    	* @param str 描画する文字列を指定します。
    	* @param x X座標を指定します。
    	* @param y Y座標を指定します。
    	*/
    	public void drawString(String str, int x, int y) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - getStringWidth(str))/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - getStringHeight(str))/2;
    		}
    		
    		g.drawString(str, dx, dy + Font.getDefaultFont().getBBoxHeight(str));
    	}
    	
    	
    	/**
    	* イメージを描画します。
    	*
    	* @param image 描画するイメージオブジェクトを指定します。
    	* @param x X座標を指定します。
    	* @param y Y座標を指定します。
    	*/
    	public void drawImage(Image image, int x, int y) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - image.getWidth())/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - image.getHeight())/2;
    		}
    		
    		g.drawImage(image, dx, dy);
    	}
    	
    	
    	/**
    	* ゲーム用スレッドの処理です。
    	*/
    	public void run() {
    		g = getGraphics();
    		try {
    			changeScene(SC_INIT);
    			
    			while(true) {
    				keyeventHappen = false;
    				
    				controlScene();
    				
    				if(keyeventHappen == false) {
    					keyScene();
    				}
    				
    				paintScene();
    				
    				Thread.currentThread().sleep(100);
    				
    				if(frameCount < Integer.MAX_VALUE) {
    					frameCount ++;
    				}
    				else {
    					frameCount = 0;
    				}
    			}
    		}
    		catch(Throwable t) {
    			System.out.println(t.getMessage());
    			exit();
    		}
    	}
    	
    	
    	/**
    	* シーンを変更します。
    	*
    	* @param scene 変更するシーンを設定します。
    	*/
    	public void changeScene(int scene) {
    		this.scene = scene;
    		sceneSwitch = true;
    	}
    	
    	
    	/**
    	* シーンの初期化処理をすべきかを判断します。
    	*
    	* @return シーンが変更された直後はtrueを返します。
    	*		  それ以降はfalseを返します。
    	*/
    	public boolean firstScene() {
    		return sceneSwitch;
    	}
    	
    	
    	/**
    	* シーンの初期化処理が終了した場合に呼び出します。
    	*/
    	public void firstSceneEnd() {
    		sceneSwitch = false;
    	}
    	
    	
    	/**
    	* フォントの設定を行います。
    	*/
    	public void setFont(int size) {
    		int f_size = size;
    		String platform = System.getProperty("microedition.platform");
    		
    		if(platform.startsWith("SH")) {
    			// SHシリーズはデフォルトフォントが他機種より大きいので、
    			// 1サイズ下げる
    			switch(f_size) {
    				case FONT_SMALL :
    					f_size = Font.SIZE_TINY;
    					break;
    				
    				case FONT_MEDIUM :
    					f_size = FONT_SMALL;
    					break;
    				
    				case FONT_LARGE :
    					f_size = FONT_MEDIUM;
    					break;
    			}
    		}
    		
    		Font f = Font.getFont(f_size);
    		g.setFont(f);
    		Font.setDefaultFont(f);
    	}
    	
    	
    	/**
    	* 文字列の横幅の長さを取得します。
    	*
    	* @param str 対象となる文字列を設定します。
    	* @return 文字列の横幅の長さを返します。
    	*/
    	public int getStringWidth(String str) {
    		return Font.getDefaultFont().getBBoxWidth(str);
    	}
    	
    	
    	/**
    	* 文字列の縦の長さを取得します。
    	*
    	* @param str 対象となる文字列を設定します。
    	* @return 文字列の縦の長さを返します。
    	*/
    	public int getStringHeight(String str) {
    		return Font.getDefaultFont().getBBoxHeight(str);
    	}
    	
    	
    	/**
    	* ランキング画面を開きます。
    	*
    	* @param point 登録する得点を設定します。
    	*/
    	public void ranking(int point) {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------------------------------------------------
    	// 
    	// 実装部:ゲームごとに変更します。
    	// 
    	// ------------------------------------------------------------------------
    	
    	/** 「初期化」シーンです。*/
    	public static final int SC_INIT   = 0;
    	
    	/** 「タイトル」シーンです。*/
    	public static final int SC_TITLE  = 1;
    	
    	/** 「プレイ」シーンです。*/
    	public static final int SC_PLAY   = 2;
    	
    	/** 「結果」シーンです。*/
    	public static final int SC_RESULT = 3;
    	
    	
    	/**
    	* シーンごとの制御処理を振り分けます。
    	*/
    	public synchronized void controlScene() {
    		switch(scene) {
    			case SC_INIT:
    				controlInit();
    				break;
    				
    			case SC_TITLE:
    				controlTitle();
    				break;
    				
    			case SC_PLAY:
    				controlPlay();
    				break;
    				
    			case SC_RESULT:
    				controlResult();
    				break;
    		}
    	}
    	
    	
    	/**
    	* シーンごとのキー処理を振り分けます。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public synchronized boolean keyScene() {
    		if(firstScene()) {
    			return false;
    		}
    		
    		switch(scene) {
    			case SC_INIT:
    				return keyInit();
    				
    			case SC_TITLE:
    				return keyTitle();
    				
    			case SC_PLAY:
    				return keyPlay();
    				
    			case SC_RESULT:
    				return keyResult();
    		}
    		
    		return false;
    	}
    	
    	
    	/**
    	* シーンごとの描画処理を振り分けます。
    	*/
    	public synchronized void paintScene() {
    		if(firstScene()) {
    			return;
    		}
    		
    		switch(scene) {
    			case SC_INIT:
    				paintInit();
    				break;
    			
    			case SC_TITLE:
    				paintTitle();
    				break;
    			
    			case SC_PLAY:
    				paintPlay();
    				break;
    			
    			case SC_RESULT:
    				paintResult();
    				break;
    		}
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// 初期化シーン
    	// ------------------------------
    	
    	/**
    	* 初期化シーンの制御処理を行います。
    	*/
    	public void controlInit() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    		
    		// タイトル画面へ遷移
    		changeScene(SC_TITLE);
    		return;
    	}
    	
    	
    	/**
    	* 初期化シーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyInit() {
    		return false;
    	}
    	
    	
    	/**
    	* 初期化シーンの描画処理を行います。
    	*/
    	public void paintInit() {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// タイトルシーン
    	// ------------------------------
    	
    	/**
    	* タイトルシーンの制御処理を行います。
    	*/
    	public void controlTitle() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    		
    	}
    	
    	
    	/**
    	* タイトルシーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyTitle() {
    		return false;
    	}
    	
    	
    	/**
    	* タイトルシーンの描画処理を行います。
    	*/
    	public void paintTitle() {
    		draw(true);
    		
    		setColor(0, 0, 255);
    		fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);
    		
    		setColor(255, 0, 0);
    		drawString("HELLO", 10, 20);
    		
    		draw(false);
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// プレイシーン
    	// ------------------------------
    	
    	/**
    	* プレイシーンの制御処理を行います。
    	*/
    	public void controlPlay() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    	}
    	
    	
    	/**
    	* プレイシーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyPlay() {
    		return false;
    	}
    	
    	
    	/**
    	* プレイシーンの描画処理を行います。
    	*/
    	public void paintPlay() {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// 結果シーン
    	// ------------------------------
    	
    	/**
    	* 結果シーンの制御処理を行います。
    	*/
    	public void controlResult() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    	}
    	
    	
    	/**
    	* 結果シーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyResult() {
    		return false;
    	}
    	
    	
    	/**
    	* 結果シーンの描画処理を行います。
    	*/
    	public void paintResult() {
    	}
    	
    	
    	
    	
    	
    }
    


    ■v/ezアプリ用

    MIDPの Kicker.java
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    
    /**
     * ゲームの開始処理を行うクラスです。
     *	
     * @author RGB
     * @version 1.2
     */
    public class Kicker extends MIDlet {
    	
    	/**
    	 * メインのキャンバスです。
    	 */
    	private MainCanvas mc;
    	
    	
    	/**
    	* MIDlet開始時、またはPause状態時からResumeするときに呼ばれます。
    	*/
    	public void startApp() {
    		if(mc == null) {
    			mc = new MainCanvas(this);
    			Display.getDisplay(this).setCurrent(mc);
    			mc.start();
    		}
    	}
    	
    	
    	/**
    	* 電話がかかってきたときなどPauseさせる必要があるときに呼ばれます。
    	*/
    	public void pauseApp() {
    	}
    	
    	
    	/**
    	* MIDlet終了時に呼ばれます。
    	*/
    	public void destroyApp(boolean unconditional) {
    	}
    	
    	
    }
    

    MIDPの MainCanvas.java
    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
    import javax.microedition.io.*;
    import javax.microedition.rms.*;
    import java.io.*;
    import java.util.*;
    
    /**
     * メインのキャンバスです。
     *	
     * @author RGB
     * @version 1.2
     */
    public class MainCanvas extends Canvas implements Runnable {
    	
    	// ------------------------------------------------------------------------
    	// 
    	// 共通部:特に変更する必要はありません。
    	// 
    	// ------------------------------------------------------------------------
    	
    	/**
    	 * 使用領域の幅です。
    	 */
    	public static final int AREA_WIDTH = 240;
    	
    	/**
    	 * 使用領域の高さです。
    	 */
    	public static final int AREA_HEIGHT = 240;
    	
    	/**
    	 * 画面の幅です。
    	 */
    	public static int DISPLAY_WIDTH;
    	
    	/**
    	 * 画面の高さです。
    	 */
    	public static int DISPLAY_HEIGHT;
    	
    	/**
    	 * キー処理で使用する定数で、「上キー」を表します。
    	 */
    	public static final int KEY_UP = Canvas.UP;
    	
    	/**
    	 * キー処理で使用する定数で、「下キー」を表します。
    	 */
    	public static final int KEY_DOWN = Canvas.DOWN;
    	
    	/**
    	 * キー処理で使用する定数で、「右キー」を表します。
    	 */
    	public static final int KEY_RIGHT = Canvas.RIGHT;
    	
    	/**
    	 * キー処理で使用する定数で、「左キー」を表します。
    	 */
    	public static final int KEY_LEFT = Canvas.LEFT;
    	
    	/**
    	 * キー処理で使用する定数で、「決定キー」を表します。
    	 */
    	public static final int KEY_SELECT = Canvas.FIRE;
    	
    	/**
    	 * キー処理で使用する定数で、「0キー」を表します。
    	 */
    	public static final int KEY_0 = Canvas.KEY_NUM0;
    	
    	/**
    	 * キー処理で使用する定数で、「1キー」を表します。
    	 */
    	public static final int KEY_1 = Canvas.KEY_NUM1;
    	
    	/**
    	 * キー処理で使用する定数で、「2キー」を表します。
    	 */
    	public static final int KEY_2 = Canvas.KEY_NUM2;
    	
    	/**
    	 * キー処理で使用する定数で、「3キー」を表します。
    	 */
    	public static final int KEY_3 = Canvas.KEY_NUM3;
    	
    	/**
    	 * キー処理で使用する定数で、「4キー」を表します。
    	 */
    	public static final int KEY_4 = Canvas.KEY_NUM4;
    	
    	/**
    	 * キー処理で使用する定数で、「5キー」を表します。
    	 */
    	public static final int KEY_5 = Canvas.KEY_NUM5;
    	
    	/**
    	 * キー処理で使用する定数で、「6キー」を表します。
    	 */
    	public static final int KEY_6 = Canvas.KEY_NUM6;
    	
    	/**
    	 * キー処理で使用する定数で、「7キー」を表します。
    	 */
    	public static final int KEY_7 = Canvas.KEY_NUM7;
    	
    	/**
    	 * キー処理で使用する定数で、「8キー」を表します。
    	 */
    	public static final int KEY_8 = Canvas.KEY_NUM8;
    	
    	/**
    	 * キー処理で使用する定数で、「9キー」を表します。
    	 */
    	public static final int KEY_9 = Canvas.KEY_NUM9;
    	
    	/**
    	 * キー処理で使用する定数で、「*キー」を表します。
    	 */
    	public static final int KEY_ASTERISK = Canvas.KEY_STAR;
    	
    	/**
    	 * キー処理で使用する定数で、「#キー」を表します。
    	 */
    	public static final int KEY_POUND = Canvas.KEY_POUND;
    	
    	/**
    	* フォントの定数で、「サイズ小」を表します。
    	*/
    	public static final int FONT_SMALL = Font.SIZE_SMALL;
    	
    	/**
    	* フォントの定数で、「サイズ中」を表します。
    	*/
    	public static final int FONT_MEDIUM = Font.SIZE_MEDIUM;
    	
    	/**
    	* フォントの定数で、「サイズ大」を表します。
    	*/
    	public static final int FONT_LARGE = Font.SIZE_LARGE;
    	
    	/**
    	* 描画処理の定数で、「中央揃え」を表します。
    	*/
    	public static final int DRAW_CENTER = Integer.MAX_VALUE;
    	
    	/**
    	 * 押されたキーの値です。
    	 */
    	private int keyeventPressed = -1;
    	
    	/**
    	 * このキャンバスのグラフィックスオブジェクトです。
    	 */
    	private Graphics g = null;
    	
    	/**
    	 * 現在のフレームカウントです。
    	 */
    	private int frameCount = 0;
    	
    	/**
    	* 現在のシーンです。
    	*/
    	private int scene = 0;
    	
    	/**
    	 * シーンの切り替え状態を管理します。
    	 */
    	private boolean sceneSwitch = false;
    	
    	/**
    	 * 設定されたMIDletオブジェクトです。
    	 */
    	private MIDlet kicker;
    	
    	/**
    	 * ゲーム用のスレッドです。
    	 */
    	private Thread th;
    	
    	/**
    	 * キーイベント発生時にtrueとなります。
    	 */
    	private boolean keyeventHappen;
    	
    	/**
    	 * キーリピート開始時のframeCountです。
    	 */
    	private int startRepeatCount;
    	
    	/**
    	* 現在のフォントオブジェクトです。
    	*/
    	private Font f 
    		= Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
    	
    	/**
    	 * コンストラクタです。
    	 */
    	public MainCanvas(MIDlet kicker) {
    		this.kicker = kicker;
    		DISPLAY_WIDTH = getWidth();
    		DISPLAY_HEIGHT = getHeight();
    	}
    	
    	
    	/**
    	* キャンバス処理を開始します。
    	*/
    	public void start() {
    		repaint();
    	}
    	
    	
    	/**
    	* 画面の描画要求時に呼ばれます。
    	*
    	* @param g グラフィックスオブジェクトが渡されます。
    	*/
    	public void paint(Graphics g) {
    		if(th == null) {
    			this.g = g;
    			th = new Thread(this);
    			th.start();
    			Thread.currentThread().yield();
    		}
    	}
    	
    	
    	/**
    	* キーを押した時に呼ばれます。
    	*
    	* @param keyCode 押されたキーのコードを設定します。
    	*/
    	public void keyPressed(int keyCode) {
    		switch(keyCode) {
    			case KEY_0 :
    			case KEY_1 :
    			case KEY_2 :
    			case KEY_3 :
    			case KEY_4 :
    			case KEY_5 :
    			case KEY_6 :
    			case KEY_7 :
    			case KEY_8 :
    			case KEY_9 :
    			case KEY_ASTERISK :
    			case KEY_POUND :
    				keyeventPressed = keyCode;
    				break;
    			default : 
    				keyeventPressed = getGameAction(keyCode);
    				break;
    		}
    		
    		if(keyScene()) {
    			paintScene();
    			keyeventHappen = true;
    		}
    	}
    	
    	
    	/**
    	* キーを離した時に呼ばれます。
    	*
    	* @param keyCode 押されたキーのコードを設定します。
    	*/
    	public void keyReleased(int keyCode) {
    		keyeventPressed = -1;
    		startRepeatCount = 0;
    	}
    	
    	
    	/**
    	* 指定されたキーが、押された状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyPressing(int key) {
    		if(keyeventPressed == key) {
    			keyeventPressed = -1;
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* 指定されたキーが、押されっぱなしの状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyContinuing(int key) {
    		if(keyeventPressed == key) {
    			return true;
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* 指定されたキーが、キーリピート状態であるかを判定します。
    	*
    	* @param key 検索するキーを設定します。
    	*/
    	public boolean keyRepeating(int key) {
    		if(keyeventPressed == key) {
    			if(startRepeatCount == 0) {
    				startRepeatCount = frameCount;
    				return true;
    			}
    			else if(frameCount - startRepeatCount > 1) {
    				return true;
    			}
    			else {
    				return false;
    			}
    		}
    		else {
    			return false;
    		}
    	}
    	
    	
    	/**
    	* アプリを終了します。
    	*/
    	public void exit() {
    		kicker.notifyDestroyed();
    	}
    	
    	
    	/**
    	* 画像を読み込みます。
    	*
    	* @param name 画像名称を設定します。
    	* @return 読み込んだ画像を返します。
    	*/
    	public Image loadImage(String name) {
    		Image img = null;
    		try {
    			img = Image.createImage("/" + name + ".png");
    		}
    		catch(IOException ie) {
    			throw new RuntimeException(ie.getMessage());
    		}
    		return img;
    	}
    	
    	
    	/**
    	* 描画開始時・描画終了時の処理を行います。
    	*
    	* @param state 描画開始はtrue、描画終了はfalseを設定します。
    	*/
    	public void draw(boolean state) {
    		if(state) {
    		}
    		else {
    			repaint();
    		}
    	}
    	
    	
    	/**
    	* 描画に使用する色を設定します。
    	*
    	* @param red 赤要素の輝度を指定します(0〜255)。
    	* @param green 緑要素の輝度を指定します(0〜255)。
    	* @param blue 青要素の輝度を指定します(0〜255)。
    	*/
    	public void setColor(int red, int green, int blue) {
    		g.setColor(red, green, blue);
    	}
    	
    	
    	/**
    	* 矩形領域を塗りつぶします。
    	*
    	* @param x 矩形の左上のX座標を指定します。
    	* @param y 矩形の左上のY座標を指定します。
    	* @param width 矩形の幅を指定します。
    	* @param height 矩形の高さを指定します。
    	*/
    	public void fillRect(int x, int y, int width, int height) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - width)/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - height)/2;
    		}
    		
    		g.fillRect(dx, dy, width, height);
    	}
    	
    	
    	/**
    	* 文字列を描画します。
    	*
    	* @param str 描画する文字列を指定します。
    	* @param x X座標を指定します。
    	* @param y Y座標を指定します。
    	*/
    	public void drawString(String str, int x, int y) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - getStringWidth(str))/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - getStringHeight(str))/2;
    		}
    		
    		g.drawString(str, dx, dy, Graphics.TOP|Graphics.LEFT);
    	}
    	
    	
    	/**
    	* イメージを描画します。
    	*
    	* @param image 描画するイメージオブジェクトを指定します。
    	* @param x X座標を指定します。
    	* @param y Y座標を指定します。
    	*/
    	public void drawImage(Image image, int x, int y) {
    		int dx = x;
    		int dy = y;
    		
    		if(dx == DRAW_CENTER) {
    			dx = (AREA_WIDTH - image.getWidth())/2;
    		}
    		
    		if(dy == DRAW_CENTER) {
    			dy = (AREA_HEIGHT - image.getHeight())/2;
    		}
    		
    		g.drawImage(image, dx, dy, Graphics.TOP|Graphics.LEFT);
    	}
    	
    	
    	/**
    	* ゲーム用スレッドの処理です。
    	*/
    	public void run() {
    		try {
    			changeScene(SC_INIT);
    			
    			while(true) {
    				keyeventHappen = false;
    				
    				controlScene();
    				
    				if(keyeventHappen == false) {
    					keyScene();
    				}
    				
    				paintScene();
    				
    				Thread.currentThread().sleep(100);
    				
    				if(frameCount < Integer.MAX_VALUE) {
    					frameCount ++;
    				}
    				else {
    					frameCount = 0;
    				}
    			}
    		}
    		catch(Throwable t) {
    			System.out.println(t.getMessage());
    			exit();
    		}
    	}
    	
    	
    	/**
    	* シーンを変更します。
    	*
    	* @param scene 変更するシーンを設定します。
    	*/
    	public void changeScene(int scene) {
    		this.scene = scene;
    		sceneSwitch = true;
    	}
    	
    	
    	/**
    	* シーンの初期化処理をすべきかを判断します。
    	*
    	* @return シーンが変更された直後はtrueを返します。
    	*		  それ以降はfalseを返します。
    	*/
    	public boolean firstScene() {
    		return sceneSwitch;
    	}
    	
    	
    	/**
    	* シーンの初期化処理が終了した場合に呼び出します。
    	*/
    	public void firstSceneEnd() {
    		sceneSwitch = false;
    	}
    	
    	
    	/**
    	* フォントの設定を行います。
    	*/
    	public void setFont(int size) {
    		f = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, size);
    		g.setFont(f);
    	}
    	
    	
    	/**
    	* 文字列の横幅の長さを取得します。
    	*
    	* @param str 対象となる文字列を設定します。
    	* @return 文字列の横幅の長さを返します。
    	*/
    	public int getStringWidth(String str) {
    		return f.stringWidth(str);
    	}
    	
    	
    	/**
    	* 文字列の縦の長さを取得します。
    	*
    	* @param str 対象となる文字列を設定します。
    	* @return 文字列の縦の長さを返します。
    	*/
    	public int getStringHeight(String str) {
    		return f.getHeight();
    	}
    	
    	
    	/**
    	* ランキング画面を開きます。
    	*
    	* @param point 登録する得点を設定します。
    	*/
    	public void ranking(int point) {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------------------------------------------------
    	// 
    	// 実装部:ゲームごとに変更します。
    	// 
    	// ------------------------------------------------------------------------
    	
    	/** 「初期化」シーンです。*/
    	public static final int SC_INIT   = 0;
    	
    	/** 「タイトル」シーンです。*/
    	public static final int SC_TITLE  = 1;
    	
    	/** 「プレイ」シーンです。*/
    	public static final int SC_PLAY   = 2;
    	
    	/** 「結果」シーンです。*/
    	public static final int SC_RESULT = 3;
    	
    	
    	/**
    	* シーンごとの制御処理を振り分けます。
    	*/
    	public synchronized void controlScene() {
    		switch(scene) {
    			case SC_INIT:
    				controlInit();
    				break;
    				
    			case SC_TITLE:
    				controlTitle();
    				break;
    				
    			case SC_PLAY:
    				controlPlay();
    				break;
    				
    			case SC_RESULT:
    				controlResult();
    				break;
    		}
    	}
    	
    	
    	/**
    	* シーンごとのキー処理を振り分けます。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public synchronized boolean keyScene() {
    		if(firstScene()) {
    			return false;
    		}
    		
    		switch(scene) {
    			case SC_INIT:
    				return keyInit();
    				
    			case SC_TITLE:
    				return keyTitle();
    				
    			case SC_PLAY:
    				return keyPlay();
    				
    			case SC_RESULT:
    				return keyResult();
    		}
    		
    		return false;
    	}
    	
    	
    	/**
    	* シーンごとの描画処理を振り分けます。
    	*/
    	public synchronized void paintScene() {
    		if(firstScene()) {
    			return;
    		}
    		
    		switch(scene) {
    			case SC_INIT:
    				paintInit();
    				break;
    			
    			case SC_TITLE:
    				paintTitle();
    				break;
    			
    			case SC_PLAY:
    				paintPlay();
    				break;
    			
    			case SC_RESULT:
    				paintResult();
    				break;
    		}
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// 初期化シーン
    	// ------------------------------
    	
    	/**
    	* 初期化シーンの制御処理を行います。
    	*/
    	public void controlInit() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    		
    		// タイトル画面へ遷移
    		changeScene(SC_TITLE);
    		return;
    	}
    	
    	
    	/**
    	* 初期化シーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyInit() {
    		return false;
    	}
    	
    	
    	/**
    	* 初期化シーンの描画処理を行います。
    	*/
    	public void paintInit() {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// タイトルシーン
    	// ------------------------------
    	
    	/**
    	* タイトルシーンの制御処理を行います。
    	*/
    	public void controlTitle() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    		
    	}
    	
    	
    	/**
    	* タイトルシーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyTitle() {
    		return false;
    	}
    	
    	
    	/**
    	* タイトルシーンの描画処理を行います。
    	*/
    	public void paintTitle() {
    		draw(true);
    		
    		setColor(0, 0, 255);
    		fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);
    		
    		setColor(255, 0, 0);
    		drawString("HELLO", 10, 20);
    		
    		draw(false);
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// プレイシーン
    	// ------------------------------
    	
    	/**
    	* プレイシーンの制御処理を行います。
    	*/
    	public void controlPlay() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    	}
    	
    	
    	/**
    	* プレイシーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyPlay() {
    		return false;
    	}
    	
    	
    	/**
    	* プレイシーンの描画処理を行います。
    	*/
    	public void paintPlay() {
    	}
    	
    	
    	
    	
    	
    	// ------------------------------
    	// 結果シーン
    	// ------------------------------
    	
    	/**
    	* 結果シーンの制御処理を行います。
    	*/
    	public void controlResult() {
    		if(firstScene()) {
    			firstSceneEnd();
    		}
    	}
    	
    	
    	/**
    	* 結果シーンのキー処理を行います。
    	*
    	* @return キーイベントが処理された場合にtrueを返します。
    	*/
    	public boolean keyResult() {
    		return false;
    	}
    	
    	
    	/**
    	* 結果シーンの描画処理を行います。
    	*/
    	public void paintResult() {
    	}
    	
    	
    	
    	
    	
    }
    
     
    RGBの携帯Java入門

    Copyright (c) RGB