見出し画像

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


実行結果1: ザコは一撃
実行結果2: ボスも撃破しました!!


はい。シューティングゲームの出来上がりです。
敵を避けながら、敵を打って倒す。それだけです。

今回実装した当たり判定を詳しく説明します。


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)
enemybullets_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_groupclone_enemiessingle_enemieswhite_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の衝突処理

いいなと思ったら応援しよう!