敵の攻撃!

これまでただ通りすぎるだけだった敵モンスターたち。ついに逆襲のときがきたようです。

敵の攻撃クラスを作成する

これまでただ左から右へと通り過ぎる敵たちを、一方的にかじったリンゴで攻撃するという通り魔的なゲームでしかありませんでしたが、そろそろ敵たちも逆襲してくるようです。

まずは、shot.pyクラスに敵の攻撃クラスMissileを作成します。

Missile画像はこんな感じです。

Missileクラスは、ほぼShotクラスです。

違いは移動が右→左固定なのくらいです。

# ミサイルクラスを作成
class Missile(pygame.sprite.Sprite):
    speed = 6

    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = tools.load_image("data", "missile.png", -1)
        self.rect = self.image.get_rect()
        self.rect.center = pos

    def update(self):
        self.rect.move_ip(-self.speed, 0)
        if self.rect.right > SCR_RECT.width:
            self.kill()

Enemyクラスに攻撃の発生を追記する

攻撃そのもののクラスができたので、Enemyクラスで攻撃を発生させる処理を追記します。

まず、発生の乱数を使うため、randomライブラリをインポートします。

import random

続いて、コンストラクタにprob_atkを追加します。

これは後ほどenemy.datに追加しますが、攻撃する確率です。

class Enemy(pygame.sprite.Sprite):
    speed = 5

    # prob_atkを引数に追加
    def __init__(self, time, image, pos, move_type, hp, name, prob_atk):
        self.prob_atk = prob_atk

    def update(self):
            # 乱数を発生させ、prob_atk以下なら攻撃
            if random.random() < self.prob_atk:
                shot.Missile(self.rect.center)

攻撃する仕組みは、random.random()関数で生成した数字がprob_atkを下回ったときに、Missileクラスのインスタンスを作成するという流れです。

enemy.datとcreate_enemys()を編集する

まず、enemy.datの最後にprob_atkの値を追加します。

値が大きければ大きいほど、攻撃する可能性が高くなります。

30,haraheris,672,120,0,1,ハラヘリス,0.05
30,haraheris,672,360,0,1,ハラヘリス,0.05
90,norokky,672,60,0,2,ノロッキー,0.05
90,norokky,672,180,0,2,ノロッキー,0.05
90,norokky,672,300,0,2,ノロッキー,0.05
150,nametsumuri,672,240,0,3,ナメツムリ,0.05

続いて、sample.pyのcreate_enemys()関数を編集します。

create_enemys()関数は、enemy.datを読み込んだデータからenemyのインスタンスを作成する関数でしたね。

ここで、追加したprob_atkをenemyクラスに渡します。

def create_enemys(self, data):
        self.prob_atk = float(data[7])

        # prob_atkを追加
        enemy.Enemy(self.time, self.image, self.pos, self.move_type, self.hp, self.name, self.prob_atk)

これで、敵たちが攻撃してくるようになりました。

当たり判定を設定する

このままでは敵の攻撃をくらっても、なにも起こりません。

そこで、当たり判定を追加していきます。

まずはsample.pyでスプライトグループを登録します。もはやおなじみの手続きですね。

class Main():
    def __init__(self):
        # misilleの衝突判定用グループを作成
        self.missiles = pygame.sprite.Group()
        # グループを登録
        shot.Missile.containers = self.all, self.missiles

続いてcollision_detection()関数にプレイヤーと敵の攻撃との当たり判定を実装します。

これもまあ、おなじみの手続きですね。

def collision_detection(self):
    missile_collided = pygame.sprite.spritecollide(self.player, self.missiles, False)
    if missile_collided:
        if self.player.invincible == False:
            self.damage_sound.play()
            self.hp.hp -= 1
            self.player.invincible = True

これで、敵が攻撃してくるようになりました!

こうなってくると、かわいいラビップルちゃんがやられないようにと緊張感が8倍、いや13倍になりますね!

めっちゃ攻撃されてますね…

prob_atkの値を調整すれば、敵の攻撃の頻度を増やしたり減らしたりできます。

ソースコードのダウンロード