敵にHPを実装する

敵にもHPを実装し、強さを設定できるようにします。

敵のファイルにHPを追加する

これまで、どんな敵であっても弾が当たれば一撃で倒すことができました。

しかし、これではわざわざ複数の敵モンスターを用意した意味がありません。同じ強さなら、みんな同じ見た目でいいわけですからね。

そこで、今回は敵にもHPを設定し、弱い敵と強い敵を出現させられるようにしましょう。

まず、enemy.datファイルに敵のHPの情報を追記します。

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

最後に追加されているのが、HPの情報です。

ハラヘリスは1、ノロッキーは2といった具合です。

続いて、Enemyクラスにもself.hpを追加します。

def __init__(self, time, image, pos, move_type, hp):
    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
    self.hp = hp

sample.pyファイルの、create_enemys関数にも追加します。

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])
        self.hp = int(data[5])

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

最後に、collision_detection関数内で、敵のHPを減らす処理をします。

def collision_detection(self):
    # 弾と敵との当たり判定
    shot_collided = pygame.sprite.groupcollide(self.enemies, self.shots, False, True)
    for enemy in shot_collided.keys():
        explosion.Explosion(enemy.rect.center)
        enemy.hp -= 1
        if enemy.hp == 0:
            enemy.kill()

ここで、groupcollideの第三引数をFalseに設定するのを忘れないでください。Trueのままだと、HPがいくら残っていても、弾と一緒に消えてしまいますからね。

groupcollideの第三引数をFalseに設定する

これで、敵にHPを設定することができました。

攻撃命中時に、敵の名前を表示する

ついでに、攻撃が命中したときに敵の名前が画面右下に表示されるようにします。

HPと同様に、enemy.datやcreate_enemys、Enemyクラスを編集していきます。

30,haraheris,672,120,0,1,ハラヘリス
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])
    self.hp = int(data[5])
    self.name = data[6]

    enemy.Enemy(self.time, self.image, self.pos, self.move_type, self.hp, self.name)
class Enemy(pygame.sprite.Sprite):

    def __init__(self, time, image, pos, move_type, hp, name):
        (省略)
        self.name = name

Mainクラス内で、フォントオブジェクトを作成します。

class Main():
    def __init__(self):
        (省略)
        self.font = pygame.font.Font("data/minamoji04.ttf", 24)
        self.enemy_name = ""

    def draw(self, screen):
        (省略)
        screen.blit(self.name_label, (500, 450))

あとは、弾と敵が衝突したときに、self.enemy_nameに敵の名前を代入すればOKです。

collision_detection内に、処理を追記します。

def collision_detection(self):

    (省略)
    for enemy in shot_collided.keys():
        explosion.Explosion(enemy.rect.center)
        enemy.hp -= 1
        self.enemy_name = enemy.name
        if enemy.hp == 0:
            enemy.kill()

初めて出てきた敵でも、その名前を知ることができますね!