これまでただ通りすぎるだけだった敵モンスターたち。ついに逆襲のときがきたようです。
敵の攻撃クラスを作成する
これまでただ左から右へと通り過ぎる敵たちを、一方的にかじったリンゴで攻撃するという通り魔的なゲームでしかありませんでしたが、そろそろ敵たちも逆襲してくるようです。
まずは、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の値を調整すれば、敵の攻撃の頻度を増やしたり減らしたりできます。