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

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

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

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

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

Q&A

解決済

1回答

9986閲覧

pygame 画像範囲のクリック

mee

総合スコア16

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

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

0グッド

0クリップ

投稿2018/12/05 12:26

編集2018/12/06 03:43

pygameについての質問です。

背景画像の上に置いた画像の範囲をクリックすると反応が返ってくる、という風にするにはどうすればいいでしょうか。

surfaceやdraw、rectなど自分なりに試してはみたのですが上手くいきません。ご教示ください!

色々やってぐちゃぐちゃになってますが現状のコード追加してみました。
Aの上に、小さめの画像でBを置いてそれをクリックすると音が出る、という感じです。

python

1import pygame 2import os 3 4SCREENRECT = (1024, 600) 5BUTTON_POSITION = (200,200) 6main_dir = '.' 7 8def load_image(file): 9 file = os.path.join(main_dir, 'data', file) 10 try: 11 surface = pygame.image.load(file) 12 except pygame.error: 13 raise SystemExit('Could not load image "%s" %s' % (file, pygame.get_error())) 14 return surface.convert() 15 16class DummySound: 17 def kappa(self): pass 18 19 20def load_sound(file): 21 if not pygame.mixer: 22 return DummySound() 23 file = os.path.join(main_dir, 'data', file) 24 try: 25 sound = pygame.mixer.Sound(file) 26 return sound 27 except pygame.error: 28 print('Warning, unable to load, %s' % file) 29 return DummySound() 30 31 32def main(): 33 pygame.init() 34 screen = pygame.display.set_mode(SCREENRECT) 35 bck = load_image('A.jpg') 36 screen.blit(bck, (0, 0)) 37 38 # tap button 39 button = load_image("B.png").convert_alpha() 40 buttonRect = pygame.Rect(BUTTON_POSITION, button.get_rect().size) 41 screen.blit(button, buttonRect) 42 pygame.display.flip() 43 44 running = True 45 while running: 46 47 for event in pygame.event.get(): 48 if event.type == pygame.QUIT: 49 running = False 50 51 if (event.type == pygame.MOUSEBUTTONDOWN) and (event.button == 1) : 52 if buttonRect.collidepoint(event.pos): 53 Csound = load_sound("C{}.wav".format(random.randrange(0, 19))) 54 return Csound.play() 55 else: 56 print("mekaabu") 57 pygame.display.update() 58 pygame.quit()

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

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

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

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

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

hayataka2049

2018/12/05 12:48

コードを例示すると回答得られやすいと思います。長いコードを追うのは大変なので単純に「画像を表示するコード」とし、実行に必要な画像も一緒にアップロードすると良いです。
guest

回答1

0

ベストアンサー

イメージの位置とサイズを格納した pygame.Rect を用意することで、pygame.Rect.collidepoint(event.pos) にてクリックした範囲がイメージ内か否かを簡単に判断することができるかと思います。

とりあえず質問のコードにてボタンイベントが動作するように修正してみましたので御確認ください。

Python

1import pygame 2import os 3 4SCREENRECT = (1024, 600) 5BUTTON_POSITION = (200,200) 6main_dir = '.' 7 8def load_image(file): 9 file = os.path.join(main_dir, 'data', file) 10 try: 11 surface = pygame.image.load(file) 12 except pygame.error: 13 raise SystemExit('Could not load image "%s" %s' % (file, pygame.get_error())) 14 return surface.convert() 15 16def main(): 17 pygame.init() 18 screen = pygame.display.set_mode(SCREENRECT) 19 bck = load_image('A.jpg') 20 screen.blit(bck, (0, 0)) 21 22 # tap button 23 button = load_image("B.png").convert_alpha() 24 buttonRect = pygame.Rect(BUTTON_POSITION, button.get_rect().size) 25 screen.blit(button, buttonRect) 26 pygame.display.flip() 27 28 running = True 29 while running: 30 31 for event in pygame.event.get(): 32 if event.type == pygame.QUIT: 33 running = False 34 35 if (event.type == pygame.MOUSEBUTTONDOWN) and (event.button == 1) : 36 if buttonRect.collidepoint(event.pos): 37 Csound = load_sound("C{}.wav".format(random.randrange(0, 19))) 38 return Csound.play() 39 else: 40 print("mekaabu") 41 pygame.display.update() 42 pygame.quit() 43 44main()

投稿2018/12/06 00:05

magichan

総合スコア15898

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

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

mee

2018/12/06 03:47

ありがとうございます!画像範囲のクリックできました! ただ、範囲内をクリックすると音が出ずエラー等もなく終了してしまうんですが、if buttonRect.collidepoint(event.pos):内の処理がおかしかったりするのでしょうか。
magichan

2018/12/06 04:17

私はサウンド処理の箇所はコメントアウトしてprint文に置き換えておりましたので気がつきませんでしたが、多分 return Csound.play() の行にて return しているのが原因かと思います。
mee

2018/12/06 04:45

ありがとうございます!ご指摘のところ修正しましたら出来ました!感謝感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問