読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

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



マップチップの描画

Pygame

今回は、マップチップを描けるようにしてみます。マウスの左クリックでマップチップを描画します。

f:id:aidiary:20100807173319p:plain

の上に

f:id:aidiary:20100807173639p:plain

を描画して陸地を作ってみます。

pymap02.zip
f:id:aidiary:20100807173638p:plain

マップチップの描画

マウスでクリックした場所のマップチップを

f:id:aidiary:20100807173639p:plain

に変更しているのはMapのupdate()です。

    def update(self, offset):
        offsetx, offsety = offset
        mouse_pressed = pygame.mouse.get_pressed()
        if mouse_pressed[0]:  # 左クリック(マップチップ描画)
            # マウスが返すのはローカル座標
            px, py = pygame.mouse.get_pos()
            # 全体マップ上での座標はoffsetを足せばよい
            # GSで割るのはピクセルをマスに直すため
            selectx = (px + offsetx) / GS
            selecty = (py + offsety) / GS
            # マップ範囲外だったら無視
            if selectx < 0 or selecty < 0 or selectx > self.col-1 \
                 or selecty > self.row-1:
                 return
            # マップを更新
            self.map[selecty][selectx] = 2  # 2は草原

pygame.mouse.get_pressed()を使って左クリックされたか調べています。左クリックされたらマウスの座標をpygame.mouse.get_pos()で取得します。ここらへんはマウスイベント(2008/5/6)で解説してあります。問題は、マウスでクリックした位置がマップ上のどの場所かを求める方法です。下図を見てください。

f:id:aidiary:20100807173640p:plain

黒い四角形がマップ全体を表し、赤い四角形が画面に表示されている範囲を表しています。mouseと書いてある矢印がマウスカーソルです。マウスで画面上をクリックしたときget_pos()で得られる座標は (px, py) です。つまり、赤い四角形の左上の座標を (0,0) としたときの座標です。これをマップ全体での座標に変換するには (offsetx, offsety) を足してやる必要があります。つまり、(px+offsetx, py+offsety) とすると黒い四角形の左上の座標を (0,0) としたときのマウスでクリックした場所の座標が得られます。これはピクセル単位の座標なので1マスのサイズGS=32で割ってやるとマス単位になります。スクリプトではこのマスがマップ範囲外だったら無視し、マップ範囲内ならself.mapを

f:id:aidiary:20100807173639p:plain

で更新しています。

マウスでマップチップを描けるようになりました。今回は草原しか描けませんでしたが、次回はさまざまなマップチップが使えるように拡張します。