ついに、ボスが現れるようです。いったいどんな強さなのでしょうか…
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()への追記は、前回のゲームオーバー画面作成時と同じ手順になるので省略します。
ボスを倒すとクリア画面が表示されるようになりました!