Lesson14 敵を撃破せよ!
前回搭載した弾丸で敵を撃破していきましょう!
弾丸と敵の当たり判定をつけて、敵のHPを削ります。
敵ごとにHPを変えれば、強敵とザコ敵を分けられます。
各キャラのHPはすでに実装済みです。
今回は当たり判定の解説を中心にやっていきます。
stage1.py
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx):
## 省略 ##
########################################################################################
#### 弾丸のクローンスプライト 修正####
## 省略 ##
def bullet_enemy_collisions(enemies_group, bullets_group):
for enemy in enemies_group.sprites():
if enemy.enemy_hp > 0:
bullet_hit_result = pygame.sprite.spritecollide(enemy, bullets_group, True, pygame.sprite.collide_mask)
if bullet_hit_result:
enemy.attack_damage(1)
for bullet in bullet_hit_result:
bullet.kill()
########################################################################################
#### ゲームループ ####
while True:
#### ステージごとに変える要素 ####
## 省略 ##
bullet_enemy_collisions(clone_enemies, new_bullets)
bullet_enemy_collisions(single_enemies, new_bullets)
bullet_enemy_collisions(white_enemies, new_bullets)
stage1.py に貼り付けたら以下を実行してください。
>python main.py
はい。シューティングゲームの出来上がりです。
敵を避けながら、敵を打って倒す。それだけです。
今回実装した当たり判定を詳しく説明します。
stage1.py
########################################################################################
#### 弾丸のクローンスプライト 修正####
## 省略 ##
def bullet_enemy_collisions(enemies_group, bullets_group): # 弾丸のダメージ判定
for enemy in enemies_group.sprites():
if enemy.enemy_hp > 0:
bullet_hit_result = pygame.sprite.spritecollide(enemy, bullets_group, True, pygame.sprite.collide_mask)
if bullet_hit_result:
enemy.attack_damage(1) # 対象エネミーのHPを1削る
for bullet in bullet_hit_result:
bullet.kill() # 衝突した弾を削除
########################################################################################
弾丸の関数の中にこんな機能が詰まっています。
pygame.sprite.spritecollide()
これは Pygame の機能で、スプライト同士の当たり判定をしてくれるものです。後ろのカッコの中に衝突するもの同士を記述します。
(enemy, bullets_group, True, pygame.sprite.collide_mask)
enemy と bullets_group が衝突したかどうかを判定します。
pygame.sprite.collide_mask
こちらはPygameの機能で、スプライトの色のついた部分(mask)に当たり判定を載せています。
上の機能を以下のループの中に入れてあります。
for enemy in enemies_group.sprites():
enemies_group の中にいる敵を1体ずつ当たり判定を付与しています。
bullet.kill()
この命令を入れることで衝突した弾丸がその場で消滅します。
bullet_enemy_collisions(clone_enemies, new_bullets) # clone_enemiesとnew_bulletsの衝突処理
bullet_enemy_collisions(single_enemies, new_bullets) # single_enemiesとnew_bulletsの衝突処理
bullet_enemy_collisions(white_enemies, new_bullets) # white_enemiesとnew_bulletsの衝突処理
こちらはゲームループ内に設置した関数の呼び出し部分です。
同じ関数に別のグループを投入しています。
enemies_group に clone_enemies 、 single_enemies 、 white_enemiesを順番に入れていきます。
これですべての敵キャラに当たり判定を付与できる仕組みです。
やっとシューティングゲームができましたね。
とはいえまだまだ荒い部分があります。
例えば、敵はどんどん画面から出ていってしまいます。
画面下部のメニューもほったらかしですしね。
次回以降で機能を追加していきます。お楽しみに★
解説付きコード
#### stage1.py ####
############################################################################################
#### ライブラリの読み込み ####
############################################################################################
#### メインプログラム ####
def main(hp,mp,idx): # 追加済み
## 省略 ##
########################################################################################
#### 弾丸のクローンスプライト 修正####
## 省略 ##
def bullet_enemy_collisions(enemies_group, bullets_group): # 弾丸のダメージ判定
for enemy in enemies_group.sprites():
if enemy.enemy_hp > 0:
bullet_hit_result = pygame.sprite.spritecollide(enemy, bullets_group, True, pygame.sprite.collide_mask)
if bullet_hit_result:
enemy.attack_damage(1) # 対象エネミーのHPを1削る
for bullet in bullet_hit_result:
bullet.kill() # 衝突した弾を削除
########################################################################################
#### ゲームループ ####
while True:
#### ステージごとに変える要素 ####
## 省略 ##
bullet_enemy_collisions(clone_enemies, new_bullets) # clone_enemiesとnew_bulletsの衝突処理
bullet_enemy_collisions(single_enemies, new_bullets) # single_enemiesとnew_bulletsの衝突処理
bullet_enemy_collisions(white_enemies, new_bullets) # white_enemiesとnew_bulletsの衝突処理