見出し画像

Lesson18 メニュー画面をつくろう

割引あり

画面下部にコマンド選択機能があります。

今はまだハリボテなので今回から中身を充実させていきます。


stage1.py

#### stage1.py ####

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

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

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

    ## 省略 ##

    damage = 1
    weapon_param = [10,20,10,]
    
    ########################################################################################

    ## 省略 ##

    ########################################################################################
    #### 弾丸のスプライト ####
    del_time_bullet = 5                                                 # 追加済み
    image00 = pygame.image.load("image/bullet.png")                     # 追加済み
   # 削除 image_bullet = pygame.transform.scale(image00, (20,20))
    def clone_bullet(hp,frame_count,new_bullets,fire,weapon_param):     # 修正
        image_bullet = pygame.transform.scale(image00, (weapon_param[1],weapon_param[1]))   # 移動&修正
        if fire == True and player_turn == False:                       # 追加済み
            fire = False                                                # 追加済み
            copy_bullet = player                                        # 追加済み

            attack_speed = weapon_param[0]
            
            ## 省略 ##

            if len(new_bullets.sprites()) <= weapon_param[2]:       # 修正
                new_bullets.add(new_bullet)                         # 追加済み

            ## 省略 ##

    def bullet_enemy_collisions(enemies_group, bullets_group,damage):   # 修正
        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(damage)
                    for bullet in bullet_hit_result:                    # 追加済み
                        bullet.kill()                                   # 追加済み

    ########################################################################################
    #### コマンドメニュー ####
    command_mode = False
    selected_item = 5
    selected_item_name = []
    def command(selected_button,selected_item):
        
        menu_surface = pygame.Surface((300, 200))
        menu_surface.fill((0,0,255))
        pygame.draw.rect(menu_surface, (255,255,0), (0, 0, 300, 200), 2)
        menu_rect = menu_surface.get_rect(center=(width // 2, height // 2))
        font = pygame.font.Font(None, 36)

        # "Back"を生成しメニューボックスに描画する
        back_text = "Back"
        back_button_index =  5
        back_text = font.render(back_text, True, (0, 0, 0))
        back_text_topleft = 10, 200 - back_text.get_height() - 10
        back_text_rect = back_text.get_rect(topleft=back_text_topleft)
        if command_mode and back_button_index == selected_item:
            selected_item_name = back_text
            pygame.draw.rect(menu_surface,(255, 0, 255),back_text_rect)

        menu_surface.blit(back_text, back_text_rect)


        screen.blit(menu_surface, menu_rect)

    
    ########################################################################################
    #### ゲームループ ####
    while True:
        
        ## 省略 ##
            
        hp,fire = clone_bullet(hp,frame_count,new_bullets,fire,weapon_param)    # 修正

        ## 省略 ##

        bullet_enemy_collisions(clone_enemies, new_bullets, damage)             # 修正
        bullet_enemy_collisions(single_enemies, new_bullets, damage)            # 修正
        bullet_enemy_collisions(white_enemies, new_bullets, damage)             # 修正

        #### キー操作設定 ####
        # 単押し
        for event in pygame.event.get():                                        # 追加済み
            
            ## 省略 ##

            if event.type == pygame.KEYDOWN:                                    # 追加済み
                
                ## 省略 ##

                if event.key == pygame.K_RETURN:                                # 追加済み
                    idx = 2                                                     # 追加済み
                    return hp, mp, idx                                          # 追加済み
 
                if event.key == pygame.K_SPACE:                                 # 追加済み
                    if player_turn:                                             # 追加済み
                        if command_mode == False:
                            if selected_button == 4:
                                selected_button = 1
                                player_turn = False
                            else:
                                command_mode = True
                        else:
                            if selected_item_name == "back":
                                selected_item = 1
                                command_mode = False

                            else:
                                if selected_button == 1:
                                    print("selected_button = 1 , selected_item_name = ",selected_item_name) 
                                elif selected_button == 2:
                                    print("selected_button = 2 , selected_item_name = ",selected_item_name) 
                                elif selected_button == 3:
                                    print("selected_button = 3 , selected_item_name = ",selected_item_name)                           # 未実装のためターミナル表示のみ
                                selected_item = 1
                                command_mode = False
                                player_turn = False
                    else:
                        selected_button = 1
                        player_turn = True


                # 削除 if event.key == pygame.K_LEFT and player_turn:
                # 削除     selected_button = max(1,selected_button - 1)
                # 削除 if event.key == pygame.K_RIGHT and player_turn:
                # 削除     selected_button = min(4,selected_button + 1)
                
                if command_mode:
                   if event.key == pygame.K_w and player_turn:
                        selected_item = max(1,selected_item - 1)
                   if event.key == pygame.K_s and player_turn:
                        selected_item = selected_item + 1
                else:
                    if event.key == pygame.K_a and player_turn:
                        selected_button = max(1,selected_button - 1)
                    if event.key == pygame.K_d and player_turn:
                        selected_button = min(4,selected_button + 1)

        ## 画面表示 ##

        ## 省略 ##        
        
        ## アイテム選択画面 ##
        if command_mode == True:
            selected_item_name = command(selected_button,selected_item)


        ## 省略 ##

かなりの追加量&修正量ですね。頑張って貼り付けてください。
難しすぎますが、追加済みの行を探してその周りを修正してくださいね。

では下記を実行してください★

>python main.py

実行結果1: スペースボタンを押してください
実行結果2: コマンド選択でもう一度スペースキーを押してください。
実行結果3: 四角いメニューが飛び出てきます。スペースキーが決定ボタンです。
実行結果4: コマンドは「a」「d」キーで選べます。
実行結果5: 「アイテム」「とくしゅ」も同じ動きです。
実行結果6: 「もどる」でスペースキーを押すと
実行結果7: プレイヤーターン終了

おおまかな動きが実装できました。

右手でマウスを握っていて、左手で「w、a、s、d」キー操作をするので、スペースキーを「決定」ボタンとしています。左手の親指で操作できます。

次回からメニューの中身を入れ込んでいきます。


では解説に移ります。
またX(旧Twitter)での拡散をお願いします☆

ここから先は

18,023字

この記事が気に入ったらサポートをしてみませんか?