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

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

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

■スプライトで多数のキャラクタを動かす

では、実際にスプライトを使って多数のイメージを動かしてみましょう。ここでは、image.jpgとimage2.jpgというイメージ(いずれも32×32)を使い、5つのイメージを動かし、衝突して消していくサンプルを作ってみます。

起動すると、画面の四隅にimage2.jpgが、中央にimage.jpgが表示されます。「GO!」ボタンを押すと、それぞれがランダムな向きと速度で動き出します。中央のimage.jpgとそれ以外のimage2.jpgが接触すると、image2.jpgは消され、最終的にはimaeg.jpgが1つだけになります。

スプライト関係の準備はsetUpで行っています。またtimerExpiredでは位置と移動方向の再設定をし、checkCollisionで衝突判定をしています。衝突している場合には、Sprite配列の衝突したSpriteが入っている要素をnullにしています。こうすることで、そのスプライトが消えます。
に非表示にしたい場合は、Spriteの「setVisible」を呼び出して表示をOFFにする方法もあります。

スプライトは、特にリアルタイムゲームを作る場合には必須の機能です。ここで基本を理解し、実際に多数のイメージを動かして、扱いに慣れておきましょう。

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

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

●プログラム・リスト●

※MainCanvasの修正
class MainCanvas extends Canvas implements TimerListener {
    private int w, h;
    private int[][] data;
    private Random random;
    private Timer timer;
    private boolean flg;
    private Sprite[] sprites;
    private SpriteSet spriteset;
    private static final int _DX = 0;
    private static final int _DY = 1;

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

    public void setUp(Image image, Image image2) {
        int xx[] = new int[] { w / 2, 0, 0, w, w };
        int yy[] = new int[] { h / 2, 0, h, 0, h };
        sprites = new Sprite[5];
        spriteset = new SpriteSet(sprites);
        sprites[0] = new Sprite(image);
        sprites[0].setLocation(xx[0], yy[0]);
        for (int i = 1; i < 5; i++) {
            sprites[i] = new Sprite(image2);
            sprites[i].setLocation(xx[i], yy[i]);
        }
    }

    public void paint(Graphics g) {
        g.lock();
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        if (spriteset != null)
            g.drawSpriteSet(spriteset);
        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) {
        for (int i = 0; i < 5; i++) {
            if (sprites[i] == null)
                continue;
            if (data[i][_DX] == 0) {
                data[i][_DX] = random.nextInt(11) - 5;
            }
            if (data[i][_DY] == 0) {
                data[i][_DY] = random.nextInt(11) - 5;
            }
            int xx = sprites[i].getX() + data[i][_DX];
            int yy = sprites[i].getY() + data[i][_DY];
            if (xx < 0) {
                xx = 0;
                data[i][_DX] = 0;
            }
            if (xx > w) {
                xx = w;
                data[i][_DX] = 0;
            }
            if (yy < 0) {
                yy = 0;
                data[i][_DY] = 0;
            }
            if (yy > h) {
                yy = h;
                data[i][_DY] = 0;
            }
            sprites[i].setLocation(sprites[i].getX() + data[i][_DX],
                    sprites[i].getY() + data[i][_DY]);
        }
        checkCollision();
        repaint();
    }

    public void checkCollision() {
        spriteset.setCollisionAll();
        for (int i = 1; i < 5; i++) {
            if (spriteset.isCollision(0, i)) {
                sprites[i] = null;
            }
        }
    }
}

※関連コンテンツ

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