人工知能に関する断創録

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

自機を動かす

まず、プレイヤーである自機をキーボードで動かせるようにします。ブロック崩し編のパドルの移動(2008/8/9)で解説したパドルと作り方はほとんど同じです。だだし、今回はキーボードで左右に移動するようにします。

invader01.zip
f:id:aidiary:20100807233404p:plain

自機スプライト

まず自機Playerの作り方です。Spriteを継承しているのでスプライトになります。スプライトの基本はスプライトの使い方(2008/5/17)、スプライトグループの使い方(2008/5/17)を参照してください。

class Player(pygame.sprite.Sprite):
    """自機"""
    speed = 5  # 移動速度
    def __init__(self):
        # imageとcontainersはmain()でセットされる
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.rect = self.image.get_rect()
        self.rect.bottom = SCR_RECT.bottom  # プレイヤーが画面の一番下
    def update(self):
        # 押されているキーをチェック
        pressed_keys = pygame.key.get_pressed()
        # 押されているキーに応じてプレイヤーを移動
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-self.speed, 0)
        elif pressed_keys[K_RIGHT]:
            self.rect.move_ip(self.speed, 0)
        self.rect.clamp_ip(SCR_RECT)

ここで、self.imageは外部のメイン関数で指定している点に注意してください。Player.imageとしているのでimageはクラス変数になります。つまり、プレイヤーオブジェクトをたくさん作っても画像がロードされるのは1回だけでimageはすべてのオブジェクトで共有されます。プレイヤーは一機しか作らないのであまり意味はありませんが、あとでエイリアンも同じように作る予定です。

update()では、どのキーボードが押されたかを調べて、その方向にスプライトのrectを移動しています。キーボードの使い方は、キーイベント(2008/5/10)を参照してください。self.rect.clamp_ip()はスプライトが画面外に出ないようにする命令です(敵前逃亡は許さんって感じ)。これは、パドルの移動(2008/8/9)でも使いました。

自機の作成・更新・描画

自機の作成、更新、描画はすべてメイン関数です。

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCR_RECT.size)
    pygame.display.set_caption(u"Invader 01 自機を動かす")
    
    # スプライトグループを作成して登録
    all = pygame.sprite.RenderUpdates()
    Player.containers = all
    # スプライトの画像を登録
    Player.image = load_image("player.png")
    # 自機を作成
    Player()
    
    clock = pygame.time.Clock()
    while True:
        clock.tick(60)
        screen.fill((0, 0, 0))
        all.update()
        all.draw(screen)
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN and event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()

スプライトの描画、更新にはスプライトグループallを使っています。allは自機のデフォルトスプライトグループとしてcontainersに登録しています。さきほど説明したように自機の画像はメイン関数でロードしてPlayer.imageにセットしています。プレイヤーの作成は、 Player()だけで十分です。Player()を呼び出すと自動的にスプライトグループallに追加されて描画、更新が始まります。まだ左右に移動しかできないので次はミサイルでも撃てるようにします。