人工知能に関する断創録

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

選択マップチップの表示

今回はちょっとした修正です。画面の左上に現在選択中のマップチップとマウスの座標を表示してみます。また、Gキーを押すとグリッドが表示されるようにします。

pymap04.zip
f:id:aidiary:20100807175230p:plain

選択中マップチップとマウス座標の表示

main()の下の部分です。

    while True:
        clock.tick(60)
        if palette.display_flag:  # パレットが表示中なら
            palette.update()
            palette.draw(screen)
        else:
            offset = calc_offset(cursor)
            # 更新
            cursor.update()
            map.update(offset)
            # 描画
            map.draw(screen, offset)
            cursor.draw(screen, offset)
            # 選択マップチップを左上に描画
            screen.blit(Map.images[palette.selected_mapchip], (10,10))
            pygame.draw.rect(screen, (0,255,0), (10,10,32,32), 3)
                # マウスの座標を描画
            px, py = pygame.mouse.get_pos()
            selectx = (px + offset[0]) / GS
            selecty = (py + offset[1]) / GS
            msg_engine.draw_string(screen, (10,56), map.name)
            msg_engine.draw_string(screen, (10,86),
                                   u"%d %d" % (selectx, selecty))
        pygame.display.update()

マップチップパレットで解説したように現在選択中のマップチップはPaletteのselected_mapchipで取得できます。その画像はMap.imagesに入っているので取ってきます。後は、この画像をblit()で描画するだけです。マウスの座標はMessageEngineを使って描画します。詳しくはメッセージエンジン(2008/6/28)を参照してください。ここで注意ですが、表示されるのはマウスの座標であってカーソル(緑の矩形)の座標ではありません。

グリッド表示

グリッドはマップの各マスの周りの黒枠です。

        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()
            elif event.type == KEYDOWN and event.key == K_SPACE:
                # パレットの表示/非表示を切り替え
                palette.display_flag = not palette.display_flag
            elif event.type == KEYDOWN and event.key == K_g:
                # グリッドの表示/非表示を切り替え
                global show_grid  # show_gridはグローバル変数
                show_grid = not show_grid

main()のイベントハンドラでGキーを押すたびにshow_gridフラグを切り替えています。show_gridがTrueのときグリッドを表示します。show_gridはどこからでもアクセスできるグローバル変数にしました。Pythonではグローバル変数を関数内などで更新するときはその前に

 global グローバル変数名

と宣言する必要があります(そうしないとローカルで新しい変数を作ってしまう)。

        # マップの描画
        for y in range(starty, endy):
            for x in range(startx, endx):
                # マップの範囲外はマップチップ番号0で描画
                if x < 0 or y < 0 or x > self.col-1 or y > self.row-1:
                    screen.blit(self.images[0],
                                (x*GS-offsetx,y*GS-offsety))
                else:
                    screen.blit(self.images[self.map[y][x]],
                                (x*GS-offsetx,y*GS-offsety))
                    if show_grid:
                        pygame.draw.rect(screen, (0,0,0),
                                (x*GS-offsetx,y*GS-offsety,GS,GS), 1)

実際にグリッドを描画するのはMapのdraw()です。マップチップを描くときにshow_gridがTrueのとき黒い枠線も描画しています。