敵を読み込む

外部ファイルを読み込み、敵を出現させられるようにします。

読み込む用のファイルを作成する

これまで、敵を出現させるためにsample.pyファイル内でインスタンス化していました。

しかし、その場合だとプログラムファイル内に敵をぞろぞろと記述することになり、現実的ではありません。

例えばステージごとに異なる敵を出現させたい場合でも、「ステージ1では〇〇と△△と…」「ステージ2では××と□□…」と書かなくてはいけなくなり大変です。

そこで、外部ファイルを作成しそれを読み込むようにすれば、編集も簡単になりますし、ステージごとに異なるファイルを読み込めば出現する敵を変えることもできます。

そこで、まずenemy.datファイルを作成します。

30,haraheris,672,120,0
30,haraheris,672,360,0
90,norokky,672,60,0
90,norokky,672,180,0
90,norokky,672,300,0
150,nametsumuri,672,240,0

細かい仕組みについては後述しますが、各数字の意味はそれぞれ

動き出す時間,モンスター名,出現するx座標,出現するy座標,動きのタイプ

です。

ファイルを読み込む

sample.pyファイルに、「ファイルを読み込む関数」と「敵を作成する関数」を追加します。

def load_enemy(self):
    file = os.path.join("data", "enemy.dat")
    f = open(file, "r", encoding="utf-8")
    for line in f:
        line = line.rstrip()
        data = line.split(",")
        self.create_enemys(data)
    f.close()

def create_enemys(self, data):
    self.time = int(data[0])
    self.image = data[1]
    self.pos = (int(data[2]), int(data[3]))
    self.move_type = int(data[4])

    enemy.Enemy(self.time, self.image, self.pos, self.move_type)

load_enemy()はenemy.datファイルを読み込むための関数です。

ファイルを一行ずつ読み込み、一行をコンマで区切ってリストに格納します。

そしてそのリストを、実際に敵を作成するcreate_enemys()に渡します。

また、このためにEnemyクラスのコンストラクタを少しいじっています。

def __init__(self, time, image, pos, move_type):
    pygame.sprite.Sprite.__init__(self, self.containers)
    self.frame = 0
    self.time = time
    self.image = tools.load_image("data/enemy", image + ".png", -1)
    self.rect = self.image.get_rect()
    self.rect.center = pos
    self.move_type = move_type
    self.exist = False

モンスターごとに異なる画像を読み込み、出現する座標も指定できるようにしています。

敵の出現は、あらかじめ描画範囲の外にすべての敵を作成しておいて、それぞれ決められたフレーム数を経過したら動き出すようにしています。

そのため、enemy.datのx座標は、(画面幅 + 画像幅 / 2)の値になります。

敵の画像のサイズは64pxなので、その半分の32pxを画面幅640pxに足した672pxが指定されています。

move_typeは、これから様々な動きを追加していくつもりです。

今はまだ右から左へ動くだけの敵しか作れませんが、move_typeで分岐させれば、縦や斜めの動きをつけることもできます。