爆発するエフェクトを導入する

敵を攻撃したときに、爆発するエフェクトがでるようにします。

爆発エフェクトを用意する

爆発のエフェクトといっても、仕組みはプレイヤーや弾のアニメーションと同じです。

Explosionクラスを新しく作成します。

import pygame
from pygame.locals import *

import tools

class Explosion(pygame.sprite.Sprite):
    animecycle = 6
    speed = 9

    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.images = tools.split_image(tools.load_image("data", "explosion.png"), 2, 1)
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.rect.center = pos
        self.frame = 0

    def update(self):
        self.frame += 1
        self.image = self.images[int(self.frame / self.animecycle % 2)]
        if self.frame >= 12:
            self.kill()

画像は、次のものを使います。

ここで、これまでと違うのは、爆発エフェクトは表示が終わったらすぐに消えてほしいという点です。

いつまでもそこに残り続けても、邪魔なだけですからね。

そこで、update関数の最後に、self.kill()を追加しています。

これは、自分自身を削除する関数です。

self.frameの値が12以上になる=二枚の画像を表示し終わったら、自分自身を削除する、という仕組みです。

敵と弾が衝突したら、爆発エフェクトを表示する

新たなクラスを作成したら、インポートしてcontainersを作成します。

Explosionクラスは描画さえできればよく、衝突判定は使わないのでself.allだけをcontainersを設定すればOKです。

import explosion

(省略)

explosion.Explosion.containers = self.all

敵と衝突したら、敵の真ん中にExplosionクラスのインスタンスを作成したいです。

そのためには、Explosionクラスに敵のrect.centerを渡してあげればいいですよね。

def collision_detection(self):
    enemy_collided = pygame.sprite.spritecollide(self.player, self.enemies, False)
    if enemy_collided:
        if self.player.invincible == False:
            # SEを再生する
            self.damage_sound.play()
            self.hp.hp -= 1
            self.player.invincible = True
    # 弾と敵との当たり判定
    shot_collided = pygame.sprite.groupcollide(self.enemies, self.shots, True, True)
    for enemy in shot_collided.keys():
        explosion.Explosion(enemy.rect.center)

collision_detection関数内の、弾と敵との当たり判定部分にコードを追加しています。

for文で弾と衝突したenemyインスタンスを探し、その中心の座標ををExplosionに渡しています。

これで、弾が当たると敵が爆発してやられるようにできましたね!