人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

エイリアン襲来

f:id:aidiary:20090901211805g:plain を実装します。

invader03.zip
f:id:aidiary:20100807234129p:plain

エイリアンクラス

エイリアンも自機、ミサイルと同様にスプライトなので作り方はほとんど同じです。

class Alien(pygame.sprite.Sprite):
    """エイリアン"""
    speed = 2  # 移動速度
    animcycle = 18  # アニメーション速度
    frame = 0
    move_width = 230  # 横方向の移動範囲
    def __init__(self, pos):
        # imagesとcontainersはmain()でセット
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.rect.center = pos
        self.left = pos[0]  # 移動できる左端
        self.right = self.left + self.move_width  # 移動できる右端
    def update(self):
        # 横方向への移動
        self.rect.move_ip(self.speed, 0)
        if self.rect.center[0] < self.left or self.rect.center[0] > self.right:
            self.speed = -self.speed
        # キャラクターアニメーション
        self.frame += 1
        self.image = self.images[self.frame/self.animcycle%2]

f:id:aidiary:20100807234130p:plain

上の図のように個々のエイリアンの移動範囲はleftとrightで指定します。leftは移動範囲の左端、rightは移動範囲の右端です。コンストラクタで与えるposは左端の座標としてます。右端は左端の座標にmove_widthを足して求めています。エイリアンはleftからrightの範囲しか移動できません。そのため、update()で移動範囲を超えたときに速度を反転して逆方向に進むようにしています。移動方向の反転は画像の移動と跳ね返り処理(2008/5/9)を参考にしてください。キャラクターアニメーションの作り方は、キャラクターアニメーション(2008/5/18)を参照してください。

エイリアンの作成

エイリアンを作成するコードはmain()にあります。

    # スプライトグループを作成して登録
    all = pygame.sprite.RenderUpdates()
    Player.containers = all
    Shot.containers = all
    Alien.containers = all  # エイリアンのデフォルトスプライトグループを指定
    # スプライトの画像を登録
    Player.image = load_image("player.png")
    Shot.image = load_image("shot.png")
    # エイリアンの画像を分割してロード
    Alien.images = split_image(load_image("alien.png"), 2)
    # 自機を作成
    Player()
    # エイリアンを作成
    for i in range(0, 50):
        x = 20 + (i % 10) * 40
        y = 20 + (i / 10) * 40
        Alien((x,y))

エイリアンは全部で50体作成してます。各エイリアンの座標 (x,y) を計算してAlienオブジェクトを作成します。Alienはデフォルトスプライトグループを指定しているのでオブジェクトを作るだけで自動的にallに追加され、描画、更新が始まります。ここら辺は自機やミサイルを作ったときと同じですね。実行するとわかりますが、エイリアンは無敵です。絶対に倒せません。ミサイルがあたったとき倒せるようにするにはミサイルとエイリアンの衝突検出を実装する必要がありますね。次回取り上げます。