人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習、Deep Learning、Kerasに関する記事が多いです。



アイテムでパワーアップ

パワーアップアイテムを導入してみます。某ゲームみたいに巨大化するアイテムがよかったんですが少し難しいので加速するアイテムを作ってみました。

f:id:aidiary:20100306223549g:plain

2つあるのはアニメーションのためです。切り替えると点滅しているように見えます。アイテムの実装はコインの実装と基本的には同じです。

mariolike09.jar

Acceleratorクラス

今回作るのは移動スピードがアップするアイテムなのでアクセラレイター(Accelerator)と名づけました。「加速するもの」って意味です。 AcceleratorクラスはCoinクラスやKuriboクラスと同じくSpriteクラスを拡張しています。短いので全部載せます。

/**
 * 加速アイテム
 */
public class Accelerator extends Sprite {
    // アイテムをとったときの音
    private AudioClip sound;

    public Accelerator(double x, double y, String fileName, Map map) {
        super(x, y, fileName, map);
        
        // サウンドをロード
        sound = Applet.newAudioClip(
                    getClass().getResource("se/chari13_c.wav"));
    }

    public void update() {
    }
    
    /**
     * サウンドを再生
     */
    public void play() {
        sound.play();
    }
    
    /**
     * アイテムを使う
     */
    public void use(Player player) {
        // プレイヤーのスピードがアップ!
        player.setSpeed(player.getSpeed() * 2);
    }
}

アイテム独自のメソッドはuse()です。このメソッドが呼ばれると引数で指定したPlayerに対してアイテムが使われます。

アイテムの配置

次にマップ上にアイテムを配置します。これもコインや栗ボーと全く同じです。マップを見てください(等幅フォントでないとずれます)。

 20
 60
 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
 B                                                          B
 B                                                          B
 B                                                          B
 B                                                          B
 B                                                          B
 B                                                          B
 B       oo                                             k   B
 B     BBBBB                                     BBBBBBBBBBBB
 B                  k                    B k B              B
 B                  ooo                  BBBBBBBB           B
 B             k                 BBB                        B
 B                                                          B
 B                        BBB                               B
 B                  BBB                            B        B
 B                                                          B
 B    BBB     BBB            ooo          BoooooooooooooooooB
 B                        BBBBBBBBBB      BoooooooooooooooooB
 B       k                    a           B            k    B
 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

aがアイテムです。このマップデータを読み込んでアイテムを作成しているのがload()です。

    for (int i = 0; i < row; i++) {
        line = br.readLine();
        for (int j = 0; j < col; j++) {
            map[i][j] = line.charAt(j);
            switch (map[i][j]) {
                case 'o':  // コイン
                    sprites.add(new Coin(tilesToPixels(j),
                                         tilesToPixels(i),
                                         "coin.gif", this));
                    break;
                case 'k':  // 栗ボー
                    sprites.add(new Kuribo(tilesToPixels(j),
                                           tilesToPixels(i),
                                           "kuribo.gif", this));
                    break;
                case 'a':  // 加速アイテム
                    sprites.add(new Accelerator(tilesToPixels(j),
                                            tilesToPixels(i),
                                            "accelerator.gif", this));
                    break;
            }
        }
    }

コインや栗ボーと同じ扱いです。aを読み込むとAcceleratorオブジェクトを作ってスプライトリストに追加しています。

アイテムの取得

    // マップにいるスプライトを取得
    LinkedList sprites = map.getSprites();            
    Iterator iterator = sprites.iterator();
    while (iterator.hasNext()) {
        Sprite sprite = (Sprite)iterator.next();
        
        // スプライトの状態を更新する
        sprite.update();

        // プレイヤーと接触してたら
        if (player.isCollision(sprite)) {
            if (sprite instanceof Coin) {  // コイン
                ・・・
            } else if (sprite instanceof Kuribo) {  // 栗ボー
                ・・・
            } else if (sprite instanceof Accelerator) {  // 加速アイテム
                // アイテムは消える
                sprites.remove(sprite);
                Accelerator accelerator = (Accelerator)sprite;
                // サウンド
                accelerator.play();
                // アイテムをその場で使う
                accelerator.use(player);
                break;
            }
        }
    }

アイテムを取って使うのはMainPanelクラスのrun()です。プレイヤーがアイテムに接触するとアイテムを取れます。アイテムを取ったらアイテムをスプライトリストから消して、サウンドを鳴らし、アイテムを使います。今回は取ったらすぐ使うようにしていますが、取得アイテムを別に管理しておいて後で使うように拡張することもできます。