StarJet.javaのコード

StarJet.javeのコードリストです。

/*
 * StarJet.java
 *
 * DATE : 2008/08/18 19:14
 */
import com.nttdocomo.ui.*;

import com.nttdocomo.util.Timer;
import com.nttdocomo.util.TimerListener;
import java.util.Vector;

/**
 * StarJet
 *
 * @author NAME
 */
public class StarJet extends IApplication {

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

}

/**
 * MainCanvas
 * 
 */
class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();
    Fighter fighter = new Fighter(g);
    Vector enemyList = new Vector();
    Timer tm1, tm2;
    int appearTerm;
    Image bangImage;
    int score;
    
    MainCanvas() {
        setSoftLabel(SOFT_KEY_1, "END");
        setSoftLabel(SOFT_KEY_2, "START");
        setBackground(Graphics.getColorOfName(Graphics.BLUE));
        
        //爆発イメージの読み込み
        try {
            MediaImage m = MediaManager.getImage("resource:///bang.gif");
            m.use();
            bangImage = m.getImage();
        } catch(Exception e) {
            System.out.println("bang.gifが見つかりません");
        }

        tm1 = new Timer();        //画面書き換え用のタイマー
        tm1.setTime(20);
        tm1.setRepeat(true);
        tm1.setListener((TimerListener)this);
        
        tm2 = new Timer();        //敵機生成用のタイマー
        tm2.setTime(appearTerm);
        tm2.setRepeat(true);
        tm2.setListener((TimerListener)this);
        
    }

    public void paint(Graphics g) {
    }

    public void processEvent(int type, int param) {
        if (type == Display.KEY_PRESSED_EVENT) {
            // カーソルキーを押したとき
            switch (param) {
            case Display.KEY_LEFT:
                fighter.dx = -2;
                break;
            case Display.KEY_RIGHT:
                fighter.dx = 2;
                break;
            case Display.KEY_UP:
                fighter.dy = -2;
                break;
            case Display.KEY_DOWN:
                fighter.dy = 2;
                break;
            default:
                break;
            }
        }
        if (type == Display.KEY_RELEASED_EVENT) {
            // カーソルキーを離したとき
            switch (param) {
            case Display.KEY_SOFT1:
                (IApplication.getCurrentApp()).terminate();
                break;
            case Display.KEY_SOFT2:
                init();
                break;
            case Display.KEY_LEFT:
            case Display.KEY_RIGHT:
                fighter.dx = 0;
                break;
            case Display.KEY_UP:
            case Display.KEY_DOWN:
                fighter.dy = 0;
                break;
            default:
                break;
            }
        }
    }

    public void timerExpired(Timer source) {
        if (source == tm1) {
            // tm1からの呼び出しで、画面を書き換える
            int id;
            
            g.lock();
            g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
            fighter.move();
            
            for (id = 0; id < enemyList.size(); id++) {
                Enemy enemy = (Enemy)enemyList.elementAt(id);
                boolean f = enemy.move();
                if (! f) {        //画面の外にはみ出したら
                    enemyList.removeElementAt(id);    //敵機をリストから削除
                    score += 10;    //得点の追加
                }
            }
            
            //ぶつかったら、爆発シーンを表示してゲームオーバー
            if (hitCheck()) {
                tm1.stop();        //tm1タイマーを止める
                tm2.stop();        //tm2タイマーを止める
                g.drawImage(bangImage, fighter.xpos - 4, fighter.ypos - 4);
                
                //スコアの表示
                g.setColor(g.getColorOfName(Graphics.YELLOW));
                g.fillRect(0, 20, Display.getWidth(), 100);
                g.setColor(g.getColorOfName(Graphics.RED));
                g.setFont(Font.getFont(Font.SIZE_LARGE));
                g.drawString("得点: " + score + "点", Display.getWidth() / 8, 80);
            }
            
            g.unlock(true);
        } else if (source == tm2) {
            //tm2からの呼び出しで、敵機を生成する
            Enemy enemy = new Enemy(g);
            enemyList.addElement(enemy);
            
            // 出現間隔をだんだん短くする
            if (appearTerm > 100) {
                appearTerm -= 5;
            }
            // 一旦タイマーを止めて、時間の再設定後再スタートさせる
            tm2.stop();
            tm2.setTime(appearTerm);
            tm2.start();
        }
    }
    
    private boolean hitCheck() {
        int id;
        int fighterWidth = fighter.getWidth();
        int fighterHeight = fighter.getHeight();

        for (id = 0; id < enemyList.size(); id++) {
            Enemy enemy = (Enemy)enemyList.elementAt(id);
            int enemyWidth = enemy.getWidth();
            int enemyHeight = enemy.getHeight();
            
            //敵機を1つずつ、ファイターとぶつかっていないかどうかを調べる
            if (enemy.xpos + enemyWidth - 4 > fighter.xpos 
                    && enemy.xpos < fighter.xpos + fighterWidth - 4
                    && enemy.ypos + enemyHeight - 4 > fighter.ypos 
                    && enemy.ypos < fighter.ypos + fighterHeight - 6) {
                return true;    //ぶつかった
            }
        }
        
        return false;        //一つもぶつからなかった
    }
    
    //ゲームの初期化を行う
    private void init() {
        appearTerm = 900;        //敵機出現間隔
        score = 0;               //スコア
        enemyList.removeAllElements();    //敵機リストのクリア
        //ファイターの出現位置
        fighter.xpos = (Display.getWidth() + fighter.getWidth()) / 2;
        fighter.ypos = Display.getWidth() / 4 * 3;
        //タイマー停止
        tm1.stop();
        tm2.stop();
        //タイマースタート
        tm1.start();
        tm2.start();
    }
}