ボス、出現!

ついに、ボスが現れるようです。いったいどんな強さなのでしょうか…

Bossクラスの作成

Bossクラスを作成します。

ボスは伝説の龍の力を継承する「タヌラゴン」です。

ほかの敵よりサイズも大きくなっています。

新たにクラスを作成するといっても、中身はほぼenemyクラスの使い回しです。

さすがにボスが通り過ぎるだけでは味気ないので、移動に関する部分だけ修正します。

class Boss(Enemy):
    def __init__(self):
        super().__init__(400, "tanuragon", (704, 240), None, 10, "タヌラゴン", 0.07)
        self.circle = False
        self.angle = 90
    
    def update(self):
        self.frame += 1
        if self.frame > self.time:
            self.exist = True

        if self.exist == True:
            if self.circle == False:
                self.rect.move_ip(-self.speed, 0)
                if self.rect.left < 440:
                    self.circle = True
            else:
                self.vx = int(3 * math.cos(math.radians(self.angle)))
                self.vy = int(3 * math.sin(math.radians(self.angle)))
                self.rect.move_ip(self.vx, self.vy)
                self.angle += self.speed
            
            if random.random() < self.prob_atk:
                shot.Missile(self.rect.center)

出現後、同じところをぐるぐる回ることで画面内に居座り続けるようにしました。

mathモジュールをインポートし、math.cos()関数やmath.radians()関数を使って、ぐるぐる回るようにしています。

数学に詳しくないので、なぜこの式でぐるぐる回るのか分かりません。数字や角度をいじっていたらそれっぽくなったので、これでいいやと思っています。

あとは、sample.pyでボスをインスタンス化すればOKです。

self.boss = enemy.Boss()

Enemyクラスを継承しているので、当たり判定などの処理も引き継がれています。

クリア画面の実装

前回のゲームオーバー画面と同じように、クリア画面を作成します。

import pygame
from pygame.locals import *
import sys

import cursor

class Clear():
    def __init__(self):
        self.select = 0
        self.clear_font = pygame.font.Font("data/minamoji04.ttf", 48)
        self.menu_font = pygame.font.Font("data/minamoji04.ttf", 32)

        self.clear = self.clear_font.render(u"STAGE CLEAR", True, (255, 255, 255))
        self.retry = self.menu_font.render(u"もう一度", True, (255, 255, 255))
        self.exit = self.menu_font.render(u"やめる", True, (255, 255, 255))

        self.cursor = cursor.Cursor(220, 230, (255, 255, 255))

    def update(self):
        if self.select == 0:
            self.cursor.y = 230
        elif self.select == 1:
            self.cursor.y = 280

    def draw(self, screen):
        screen.fill((0, 0, 0))
        screen.blit(self.clear, ((320 - (self.clear.get_width() / 2)), 100))
        screen.blit(self.retry, ((320 - (self.retry.get_width() / 2)), 225))
        screen.blit(self.exit, ((320 - (self.exit.get_width() / 2)), 275))
        self.cursor.draw(screen)

はい、title.pyをまるっとコピーし、ちょこちょこ名前を修正したら完成です。

これを、ボスのHPがゼロになったときに切り替えるように設定します。

def collision_detection(self):
    if self.boss.hp <= 0:
        global game_state
        game_state = CLEAR

update()、draw()、key_handler()への追記は、前回のゲームオーバー画面作成時と同じ手順になるので省略します。

ボスを倒すとクリア画面が表示されるようになりました!

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