見出し画像

Lesson19 アイテムをつくろう

割引あり

前回、コマンドメニュー選択後にポップアップするアイテム画面をつくりました。

今回はアイテム選択画面の中身を充実させていきます。

そもそもこれまでアイテムも何もなかったので追加していきましょう。



main.py

#### main.py ####
# ここにメインプログラムを記入します
############################################################################################
#### ライブラリの読み込み ####


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


weapons = {"Weapon1": "", "Weapon2": "","Weapon3":"","Weapon4":""} 
itemBag = {"Onigiri": 10, "Ocha": 10,"Teishoku":2,
            "Ra-men":3,"Beer":3,"Coke":1}
special = {"Bigger": "", "Smaller": "","Speeder":"","Barrier":""}


############################################################################################
#### 関数 ####


############################################################################################
#### メインループ ####
while True:                                             # 追加済み

    ## 省略 ##

    elif idx == 1:                                      # 追加済み
        if hp > 0:                                      # 追加済み
            if current_stage == 1:                      # 追加済み
                hp,mp,idx,itemBag = stage1(hp,mp,idx,weapons,itemBag,special)
                #change_stage()                         # 追加済み 

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


stage1.py

#### stage1.py ####

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

############################################################################################
#### メインプログラム ####
def main(hp,mp,idx,weapons,itemBag,special):                # 修正

    ########################################################################################
    #### コマンドメニュー ####
    command_mode = False                                          # 追加済み
    selected_item = 1                                           # 修正
    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)                           # 追加済み

        if selected_button == 1:
            original_items = weapons.items()
        elif selected_button == 2:
            original_items = itemBag.items()
        elif selected_button == 3:
            original_items = special.items()
        items = {key: value for key, value in original_items if value != 0}

        y_offset = 10
        list_selected_item = min(len(items) ,selected_item)
        selected_index = list_selected_item - 1
        selected_item = min(len(items)+1,selected_item)


        start_index = max(0, selected_index - 4)
        end_index = min(len(items), start_index + 5)
        visible_items = list(items.items())[start_index:end_index]

        back_text = "Back"                                          # 追加済み
        back_button_index = len(items) + 1                          # 修正 
        back_text_rendered = font.render(back_text, True, (0, 0, 0))# 追加済み
        back_text_rect = back_text_rendered.get_rect(topleft=(10, 200 - back_text_rendered.get_height() - 10))
        # 追加済み
        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)# 追加済み

        for i, (item, quantity) in enumerate(visible_items):
            text = font.render(f"{item}", True, (0, 0, 0))
            text_rect = text.get_rect(topleft=(10, y_offset + text.get_height() // 2))
            text2 = font.render(f"{quantity:<}", True, (0, 0, 0))
            text2_rect = text2.get_rect(topright=(290, y_offset + text.get_height() // 2))


            if command_mode and i + 1 + start_index == list_selected_item :
                if not back_button_index ==  selected_item:
                    selected_item_name = item
                    background_rect = pygame.Rect(5, y_offset + text.get_height() // 2, 290, text.get_height())
                    # アイテムボタンの形を形成
                    pygame.draw.rect(menu_surface, (255,0,255), background_rect)
            menu_surface.blit(text, text_rect)
            menu_surface.blit(text2, text2_rect)
            y_offset += text.get_height()

        menu_surface.blit(back_text_rendered, back_text_rect)       # 追加済み

        # 各ボタンをメニューボックスに載せて描画
        screen.blit(menu_surface, menu_rect)                        # 追加済み

        return selected_item_name

    ########################################################################################
    #### ゲームループ ####
    while True:
        
        ## 省略 ##
            

        #### キー操作設定 ####
        # 単押し
        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 hp <= 0:# 追加済み
            pygame.display.update()             # 追加済み
            pygame.time.delay(1500)             # 追加済み
            idx = 10                            # 追加済み
            return hp, mp, idx, itemBag
        
        ## ステージクリア ##
        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, itemBag
            
############################################################################################
#### メインプログラムを呼び出す ####
if __name__ == '__main__':
    global hp
    hp = 100
    mp = 100
    idx =1
    weapons = {"Weapon1": "", "Weapon2": "","Weapon3":"","Weapon4":""}
    itemBag = {"Onigiri": 10, "Ocha": 10,"Teishoku":2,
               "Ra-men":3,"Beer":3,"Coke":1}
    special = {"Bigger": "", "Smaller": "","Speeder":"","Barrier":""}
    main(hp,mp,idx,weapons,itemBag,special)


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

今回も大量に書いたので、ガンガンコピペしてください。

コピペできたら以下を実行してください。

>python main.py

ゲームが始まったらスペースキーを押してください。
コマンド選択ができますので、「 a , d 」キーでコマンドを選択します。
もう一度スペースキーを押すとアイテムメニューが飛び出します。

実行結果1: ボックス内にアイテム名が並んでいます。

w , s 」キーを押すと選択状態が移ります。

実行結果2: 下に進めます。
実行結果3: 6個目は最初隠れていますが選択できます。
実行結果4: Back を選択してスペースを押すと戻ります。


結構苦労しました。
アイテムの種類が増えた時の挙動が難しかったです。
ゆえにかなり複雑なコードになってしまいました。

一つ一つ説明しますので、Ⅹ(旧Twitter)で拡散して先にお進みください。

ここから先は

17,002字

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