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

人工知能に関する断創録

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



町をつくる

Pygame

今回は新しい町のマップを追加します。新しいマップを追加するためにはスクリプトを書き換える必要はないです。マップエディタでtown.mapを作る、イベントファイルtown.evtを作る、field.evtに町へ移動する移動イベントを配置するだけです。それとは別に町の中でカウンター越しにキャラクターと会話できるようにしました。

pyrpg24.zip
f:id:aidiary:20100807223054p:plain f:id:aidiary:20100807223055p:plain

フィールドから町への移動

左のスクリーンショットにあるようにフィールドに町を配置したいのでfield.evtに移動イベントを追加します。

 MOVE,7,8,28,town,1,13

これは、フィールドの (7,8) にマップチップIDが28番(町の絵)を配置し、town.mapの (1,13)に移動するという意味です。マップファイルtown.mapはマップエディタで作成しておきます。また、イベントファイルtown.evtも作成しておきます。town.evtはここで載せてしまうとつまらなくなるのでファイルをのぞいて見てください。

カウンター越しの会話

お店のキャラクターとカウンター越しに話せるようにします。改造するのはPlayerのtalk()です。

    def talk(self, map):
        """キャラクターが向いている方向のとなりにキャラクターがいるか調べる"""
        # 向いている方向のとなりの座標を求める
        nextx, nexty = self.x, self.y
        if self.direction == DOWN:
            nexty = self.y + 1
            event = map.get_event(nextx, nexty)
            if isinstance(event, Object) and event.mapchip == 41:
                nexty += 1  # テーブルがあったらさらに隣
        elif self.direction == LEFT:
            nextx = self.x - 1
            event = map.get_event(nextx, nexty)
            if isinstance(event, Object) and event.mapchip == 41:
                nextx -= 1
        elif self.direction == RIGHT:
            nextx = self.x + 1
            event = map.get_event(nextx, nexty)
            if isinstance(event, Object) and event.mapchip == 41:
                nextx += 1
        elif self.direction == UP:
            nexty = self.y - 1
            event = map.get_event(nextx, nexty)
            if isinstance(event, Object) and event.mapchip == 41:
                nexty -= 1
        # その方向にキャラクターがいるか?
        chara = map.get_chara(nextx, nexty)
        # キャラクターがいればプレイヤーの方向へ向ける
        if chara != None:
            if self.direction == DOWN:
                chara.direction = UP
            elif self.direction == LEFT:
                chara.direction = RIGHT
            elif self.direction == RIGHT:
                chara.direction = LEFT
            elif self.direction == UP:
                chara.direction = DOWN
            chara.update(map)  # 向きを変えたので更新
        return chara

となりの座標にあるイベントのマップチップIDが41番(机)のときさらにとなりの座標にキャラクターがいるか調べています。机は以前実装した一般オブジェクト(2008/7/20)です。こうすれば、カウンター越しにいるキャラクターと会話できます。

これで町ができましたね!