質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1108閲覧

上下キーを押したときの変数の変化のプログラムがうまくできない

Ritsuki

総合スコア3

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/04 15:45

前提・実現したいこと

 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

変数が多くて読むのが難しいですが、
値の設定は問題なさそうに見えますね。

「1度だけ押したはずなのに、1→3になって」
ですが、途中に「2」になってはいないでしょうか?

pygame.key.get_pressed()
get the state of all keyboard buttons
get_pressed() -> bools

(機械翻訳)
キーボードの各キーの状態を表すブール値の配列を返します。配列のインデックスには、キーの定数値を使用します。真の値は、ボタンが押されたことを意味します。

注意 この関数で押されたボタンのリストを取得することは、ユーザからのテキスト入力を処理するための適切な方法ではありません。押されたキーの順番を知る方法がなく、 pygame.key.get_pressed() を2回呼ぶ間に、急速に押されたキーに全く気づかないことがあります。また、押されたキーを完全に翻訳された文字値に変換する方法もありません。この機能のためのイベントやキューとのやりとりについては、 pygame.eventpygame モジュールの pygame.KEYDOWN イベントを参照してください。

https://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed

get_pressedのリファレンスを見たところ、
ある時点にキーが押されているか押されていないかしか判断できないように見えました。

1度だけ押したつもりでもループして何度も下キーを読み込み処理しているのではないかと思いました。

引用したリファレンスにあるように、
「pygame.KEYDOWN イベントを参照してください。」
で処理するのが適切かもしれません。

とりあえず、
pygame.time.wait(200)
の部分を1000ミリ秒とかもっと長くとってみるとかでしょうか。

投稿2021/12/05 01:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ritsuki

2021/12/05 01:37

なるほど!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問