libro
www.tuyano.com
iアプリ・プログラミング入門

タイマーでスプライトをリアルタイムに動かす (3/5)

作成:2009-12-30 10:06
更新:2009-12-30 10:06

■タイマーでボールを動かす

では、実際に簡単なサンプルを作ってみましょう。ここでは、image.jpgというイメージを用意し、これを読み込んでタイマーを使って動かしてみましょう。image.jpgは、32×32ドットで作成し、「res」フォルダ内にコピーしておいてください。そして、MainCanvasクラスを以下のリストのように修正します。

ここでは、image.jpgをランダムな方向にゆっくりと動かしています。ソフトキーの「GO!」を押すと、アニメーションを開始し、「STOP」を押すと停止します。上下左右の端までいくと、またランダムな速さで跳ね返ってきます。

ここでは、イメージを表示する位置を示す変数x,yと、これらに加算する値を示すdx,dyを用意しています。そして、timerExpiredではdx,dyをx,yに加算し、表示する位置を少しずつ変更しています。後は、現在位置が端まできてしまった場合には、dx,dyの値をゼロに戻し、再設定するようにします。

dx,dyの値は、Randomを使って-10~10の間で指定しています。Randomは、Java SEのjava.utilにあるクラスですが、これはDoJaでも使うことができます。といってもJava SEの全機能が使えるわけではありません。DoJaの土台となっている、Java MEの「CLDC」というコンフィグレーション(想定実行環境)に、Randomは用意されています。このため使うことができるのです。DoJaの開発では、DoJa独自のクラスの他に、この「CLDCに用意されているJava標準のクラス」も使うことができます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※MainCanvasの修正
// import java.util.*;
// import com.nttdocomo.util.*;

class MainCanvas extends Canvas implements TimerListener {
    private Image image;
    private int x, y, dx, dy, w, h;
    private Random random;
    private Timer timer;
    private boolean flg;

    MainCanvas() {
        this.setSoftLabel(Frame.SOFT_KEY_1, "GO!");
        this.setSoftLabel(Frame.SOFT_KEY_2, "EXIT");
        random = new Random(new Date().getTime());
        timer = new Timer();
        timer.setTime(100);
        timer.setRepeat(true);
        timer.setListener(this);
        try {
            MediaImage mi = MediaManager.getImage("resource:///image.gif");
            mi.use();
            image = mi.getImage();
        } catch (ConnectionException e) {}
        w = Display.getWidth() - image.getWidth();
        h = Display.getHeight() - image.getHeight();
    }

    public void paint(Graphics g) {
        g.lock();
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        g.drawImage(image, x, y);
        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:
                if (!flg){
                    timer.start();
                    this.setSoftLabel(Frame.SOFT_KEY_1, "STOP");
                    flg = true;
                } else {
                    timer.stop();
                    this.setSoftLabel(Frame.SOFT_KEY_1, "GO!");
                    flg = false;
                }
                break;
            case Display.KEY_SOFT2:
                IApplication.getCurrentApp().terminate();
                break;
            }
            repaint();
        }
    }

    public void timerExpired(Timer t) {
        if (dx == 0){
            dx = random.nextInt(11) - 5;
        }
        if (dy == 0){
            dy = random.nextInt(11) - 5;
        }
        x += dx;
        y += dy;
        if (x < 0){
            dx = 0;
            x = 0;
        }
        if (x > w){
            dx = 0;
            x = w;
        }
        if (y < 0){
            dy = 0;
            y = 0;
        }
        if (y > h){
            dy = 0;
            y = h;
        }
        repaint();
    }
}

※関連コンテンツ

「iアプリ・プログラミング入門」に戻る