前提・実現したいこと
python初心者です。pygameを利用して、RPGの選択画面のコマンドを作りたいと思っています。透明化を有効にしたsurfaceを選択肢の上に重ねることで今、どれを選んでいるのかわかるようにしています。
発生している問題・エラーメッセージ
エラーメッセージは出ません。ですが、上下キーを押したときにsurfaceの透明化がうまくできず、一番上のの選択肢が選択されているときに下キーを押したはずが3つ目の選択肢が選択されていることになったりしてしまいます。
今何番が選ばれているのか、プログラムに使われている変数を表示してみたところ、1度だけ押したはずなのに、1→3になってしまったりしていました。(下の方にそのプログラムがあります)
該当のソースコード
python
1import pygame 2from pygame import key 3from pygame.locals import * 4import sys 5 6pygame.init() #pygameの初期化 7 8WHITE = 255, 255, 255 #色のRGBA 9LIGHTGRAY = 255, 255, 255, 20 10LIGHTGRAY_ALPHA = 255, 255, 255, 128 11 12RPG_FONT = pygame.font.Font("RPG.ttf", 32) #RPG風フォントの指定("フォントのファイル名", フォントサイズ) 13title = "実行しますか?" #表示する文字 フォントの使用には最初にpygameの初期化が必要 14command1 = "はい" 15command2 = "いいえ" 16command3 = "わからない" 17max_count = 3 18 19text1_x = 100 #textの座標 20text1_y = 30 21 22text2_x = 100 23text2_y = 90 24 25text3_x = 100 26text3_y = 150 27 28text4_x = 100 29text4_y = 210 30 31quits = 0 #Enterが押されたなら 32counter = 1 #選択肢のカウント 33 34screen = pygame.display.set_mode((1920, 1030)) #画面を生成 35pygame.display.set_caption("Textの表示") #タートルバーに表示する文字 36font = pygame.font.Font(None, 55) #フォントの設定(55px) 37 38#選択肢の数だけ増やす 39text1 = RPG_FONT.render(title, True, (WHITE)) #タイトル (変数名, True, (色)) 40text2 = RPG_FONT.render(command1, True, (WHITE)) 41text3 = RPG_FONT.render(command2, True, (WHITE)) 42text4 = RPG_FONT.render(command3, True, (WHITE)) 43 44#選択肢の数だけブロックを増やす 45block1 = pygame.Surface((25 + len(title) * 30, 40), flags = pygame.SRCALPHA) #透明化を有効にしたsurface 46block1.fill((LIGHTGRAY)) 47 48block2 = pygame.Surface((25 + len(command1) * 30, 40), flags = pygame.SRCALPHA) 49block2.fill((LIGHTGRAY)) 50 51block3 = pygame.Surface((25 + len(command2) * 30, 40), flags = pygame.SRCALPHA) 52block3.fill((LIGHTGRAY)) 53 54block4 = pygame.Surface((25 + len(command3) * 30, 40), flags = pygame.SRCALPHA) 55block4.fill((LIGHTGRAY)) 56 57 58while(True): 59 screen.fill((0,0,0)) #画面を黒色に塗りつぶし 60 61 if quits == 0: #Enterが押されていないなら表示する 62 screen.blit(text1, [text1_x, text1_y]) #選択肢の数だけ増やす 63 screen.blit(text2, [text2_x, text2_y]) #文字列の表示位置 64 screen.blit(text3, [text3_x, text3_y]) 65 screen.blit(text4, [text4_x, text4_y]) 66 screen.blit(block1, (90, 27)) #ブロックの表示位置 67 screen.blit(block2, (90, 88)) 68 screen.blit(block3, (90, 149)) 69 screen.blit(block4, (90, 210)) 70 71 pygame.event.pump() 72 pressed_key = pygame.key.get_pressed() #キーが押された時の処理 73 if pressed_key[K_UP] and counter > 0: #上キーが押された時の処理 74 counter -= 1 75 76 elif pressed_key[K_DOWN] and counter < max_count: #下キーが押された時の処理 77 counter += 1 78 79 if pressed_key[K_RETURN]: #Enterが押された時の処理 80 quits = 1 81 82 if counter == 1: #ブロックの数だけ増やす 83 if quits == 0: 84 block2.fill((LIGHTGRAY_ALPHA)) 85 screen.blit(block2, (90, 88)) 86 87 block3.fill((LIGHTGRAY)) 88 screen.blit(block3, (90, 149)) 89 90 block4.fill((LIGHTGRAY)) 91 screen.blit(block3, (90, 210)) 92 93 elif counter == 2: 94 if quits == 0: 95 block3.fill((LIGHTGRAY_ALPHA)) 96 screen.blit(block3, (90, 149)) 97 98 block2.fill((LIGHTGRAY)) 99 screen.blit(block2, (90, 88)) 100 101 block4.fill((LIGHTGRAY)) 102 screen.blit(block4, (90, 210)) 103 104 elif counter == 3: 105 if quits == 0: 106 block4.fill((LIGHTGRAY_ALPHA)) 107 screen.blit(block4, (90, 210)) 108 109 block2.fill((LIGHTGRAY)) 110 screen.blit(block2, (90, 88)) 111 112 block3.fill((LIGHTGRAY)) 113 screen.blit(block3, (90, 149)) 114 115 text_counter = str(counter) 116 counters = RPG_FONT.render(text_counter, True, (WHITE)) 117 screen.blit(counters, [700, 100]) 118 119 120 pygame.display.flip() #画面を更新 121 pygame.display.update() 122 pygame.time.wait(200) 123 124 125 for event in pygame.event.get(): 126 if event.type == QUIT: #閉じるボタンが押されたら終了 127 pygame.quit() #pygameの終了 128 sys.exit()
試したこと
上にも書いてある通り、今どの選択肢が選ばれているのかを表している変数を表示させたところ、おそらく上下キーを押したときのプログラムに問題があるとわかりました。ただ、直す方法がわかりません。
補足情報(FW/ツールのバージョンなど)
pythonのバージョン:python3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/05 01:37