![見出し画像](https://assets.st-note.com/production/uploads/images/131892076/rectangle_large_type_2_87ac3870c94c30a9bd38296eacafbc46.png?width=1200)
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 」キーでコマンドを選択します。
もう一度スペースキーを押すとアイテムメニューが飛び出します。
![](https://assets.st-note.com/img/1708685792345-e8KFILzRW9.png?width=1200)
「 w , s 」キーを押すと選択状態が移ります。
![](https://assets.st-note.com/img/1708685797068-GJH9Hst8jb.png?width=1200)
![](https://assets.st-note.com/img/1708685808163-eKfsqO9jMG.png?width=1200)
![](https://assets.st-note.com/img/1708685811458-hkVRU2Tgsn.png?width=1200)
結構苦労しました。
アイテムの種類が増えた時の挙動が難しかったです。
ゆえにかなり複雑なコードになってしまいました。
一つ一つ説明しますので、Ⅹ(旧Twitter)で拡散して先にお進みください。
ここから先は
17,002字
この記事が気に入ったらチップで応援してみませんか?