見出し画像

Lesson17 ゲームフェーズをつくろう

割引あり

前回まででシューティングゲームの形はほぼ完成です。

今回は、プログラム全体の構造を大きく変えることになります。

というのも、今のところステージ1が始まると同時にすべての敵キャラが出現しますよね。別にそれはそれでいいのですが、どうせならある程度順番に敵が出てくるようにしたいところです。

そこで今回導入するのが、「ゲームフェーズ」です。

例えば、敵Aを倒したら次の敵が出現するという具合にフェーズを構築します。

ではやっていきましょう。


stage1.py

#### stage1.py ####

############################################################################################
#### ライブラリの読み込み ####

############################################################################################
#### メインプログラム ####
def main(hp,mp,idx):       # 追加済み

    ########################################################################################
    #### 初期設定 ####

    phase_count = 1
    new_create = True
    original_bomb = pygame.image.load("image/bakuhatsu3.png")
    image_bomb = pygame.transform.scale(original_bomb, (100, 100))

    ########################################################################################

    ## 省略 ##

    ########################################################################################
    #### ザコ敵のスプライト ####
    #★★ 関数に入れて、一部修正 ★★
    def blue_enemy_create():
        blue_enemy_width = 100
        blue_enemy_height = 100
        image1 = pygame.image.load("image/alien_ufo.png")
        image_blue_enemy = pygame.transform.scale(image1, (blue_enemy_width, blue_enemy_height))
     # 削除 image2 = pygame.image.load("image/bakuhatsu3.png")
     # 削除 image_bomb = pygame.transform.scale(image2, (blue_enemy_width, blue_enemy_height))
        blue_enemy_params = {
            'x': 600,
            'y': 30,
            'image': image_blue_enemy,
            'image_bomb': image_bomb,
            'speed_x': 0,
            'speed_y': 1,
            'rotation_speed': 0,
            'start_angle': 0,
            'atk': 1.0,
            'enemy_hp': 5,
            'size_multiplier': 1.0,
            }
        blue_enemy = Enemy(**blue_enemy_params)
        single_enemies.add(blue_enemy)

        return blue_enemy


    def single_enemy(hp):       # 追加済み
        
        ## 省略 ##

        return hp               # 追加済み

    ########################################################################################

    ## 省略 ##

    ########################################################################################
    #### 同じ敵を複数作る場合 ####
    #### エネミーのスプライト ####
    #★★ 関数に入れる ★★
    def white_enemy_create():
        white_enemy_width = 100
        white_enemy_height = 100
        image3 = pygame.image.load("image/character_fish_ika.png")
        image_white = pygame.transform.scale(image3, (white_enemy_width, white_enemy_height))
        white_enemy_params = [
            {'x': 500, 'y': 10, 'image': image_white, 'image_bomb': image_bomb, 'speed_x': -1, 'speed_y': 1,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            {'x': 500, 'y': 400, 'image': image_white, 'image_bomb': image_bomb,  'speed_x': -1, 'speed_y': 0,'rotation_speed':10,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            {'x': 500, 'y': 710, 'image': image_white, 'image_bomb': image_bomb,  'speed_x': -1, 'speed_y': -1,'rotation_speed':-10,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            {'x': 920, 'y': 10, 'image': image_white, 'image_bomb': image_bomb,  'speed_x': -2, 'speed_y': 1,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            {'x': 920, 'y': 300, 'image': image_white, 'image_bomb': image_bomb,  'speed_x': -2, 'speed_y': 0,'rotation_speed':5,'start_angle':0,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            {'x': 920, 'y': 710, 'image': image_white, 'image_bomb': image_bomb,  'speed_x': -2, 'speed_y': -1,'rotation_speed':5,'start_angle':45,'atk': 1.0,'enemy_hp':1,'size_multiplier':1.0},
            ]
        # パラメータを元に生成
        for params in white_enemy_params:
            white_enemy = Enemy(**params)
            white_enemies.add(white_enemy)


    def white(hp):              # 追加済み
        
        ## 省略 ##

        return hp               # 追加済み
    
    ########################################################################################
    #### ボスキャラのスプライト ####
    #★★ 関数に入れる ★★
    def boss_enemy_create():
        boss_width = 200
        boss_height = 200
        image1 = pygame.image.load("image/space_kaseijin.png")
        image_boss = pygame.transform.scale(image1, (boss_width, boss_height))
        image2 = pygame.image.load("image/bakuhatsu4.png")
        image_bomb = pygame.transform.scale(image2, (boss_width, boss_height))
        boss_enemy_params = {
            'x': 780,
            'y': 360,
            'image': image_boss,
            'image_bomb': image_bomb,
            'speed_x': 0,
            'speed_y': 0,
            'rotation_speed': 5,
            'start_angle': -90,
            'atk': 5,
            'enemy_hp': 5,
            'size_multiplier': 1.0,
            'dead_flag': False,
            'circle_R': 100
            }
        boss_enemy = BossEnemy(**boss_enemy_params)
        single_enemies.add(boss_enemy)


    ########################################################################################
        
    ## 省略 ##

    ########################################################################################
    #### ゲームループ ####
    while True:       # 追加済み

        ## 省略 ##
 
        #### ステージごとに変える要素 ####
       
        if phase_count ==1:
            if new_create:
                white_enemy_create()
                new_create = False
            hp = white(hp)

        if phase_count ==2:
            if new_create:
                blue_enemy = blue_enemy_create()
                new_create = False
            hp = single_enemy(hp) 
            hp = clone(hp,frame_count,clone_enemies)
        
        if phase_count == 3:
            if new_create:   
                boss_enemy_create()
                new_create = False
            hp = single_enemy(hp)

     #削除    hp = white(hp)
     #削除    hp = single_enemy(hp)
     #削除    hp = clone(hp,frame_count,clone_enemies)         
        hp,fire = clone_bullet(hp,frame_count,new_bullets,fire) # 追加済み
        first_player()                                          # 追加済み


        ## 省略 ##


        ## ステージクリア ##
        total_enemies = len(single_enemies.sprites()) + len(clone_enemies.sprites()) + len(white_enemies.sprites())
        if total_enemies == 0:
            phase_count += 1 
            new_create = True
            if phase_count == 4:
                pygame.display.update()
                pygame.time.delay(1500)
                idx = 2
                return hp, mp, idx

        pygame.display.update()         # 追加済み
        if player_turn == False:        # 追加済み
            frame_count += 1            # 追加済み
        clock.tick(30)                  # 追加済み

    ########################################################################################

はい。激長です。

すでに記述した部分を大きく修正しています。
わかりにくい部分もありますね。

基本的な貼り付け方として、今回の追加部分をそのまま追記してからダブりのコードを削除していくようにしてください。

また前回までに追加済みで今回変更しないでいいコードは「追加済み」か「## 省略 ##」と書いてあります。

上手に変更できたら下記を実行してください。

>python main.py

実行がうまくいけば下記のようになります。

実行結果1: まず白い敵が出てきます
実行結果2: 白い敵を全部を倒すと
実行結果3: 青いUFOがクローンとともに出現
実行結果4: 青い敵の次は赤いボスです
実行結果5:それも撃破すれば
実行結果6: 見事クリア!となります

どうですか?ゲームっぽいでしょ?

解説は激長になります。心してお進みください。

ここから先は

18,321字

この記事が気に入ったらチップで応援してみませんか?