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

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

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

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

Q&A

解決済

1回答

119閲覧

Pygameで当たり判定から物を消す方法を知りたい

Jun1971

総合スコア9

Pygame

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

0グッド

0クリップ

投稿2024/02/20 14:09

実現したいこと

当たり判定から、落ちてくるリンゴをかごで受け止めたときに消したい

前提

Pygameでランダムに落ちてくる林檎をかごで受け止めるゲームのプログラムを作っています。

発生している問題・エラーメッセージ

エラーはありません。

該当のソースコード

Pygame

1import pygame 2import sys 3import random 4 5pygame.init() 6# 画面のサイズ 7WIDTH, HEIGHT = 800, 600 8screen = pygame.display.set_mode((WIDTH, HEIGHT)) 9pygame.display.set_caption("ランダムなリンゴが落ちるプログラム") 10 11# リンゴの初期位置 12apples = [] 13apple_speed = 5 14# かごの初期位置 15basket_x, basket_y = WIDTH//2, HEIGHT-50 16basket_speed = 10 # かごの移動速度 17# ゲームループ 18while True: 19 for event in pygame.event.get(): 20 if event.type == pygame.QUIT: 21 pygame.quit() 22 sys.exit() 23 24 # ランダムな位置にリンゴを追加 25 if random.random() < 0.02: # 2%の確率でリンゴを追加 26 apple_x = random.randint(0, WIDTH) 27 apples.append((apple_x, 0)) 28 29 # リンゴを下に移動 30 new_apples = [] 31 for apple_x, apple_y in apples: 32 apple_y += apple_speed 33 new_apples.append((apple_x, apple_y)) 34 apples = new_apples 35 # かごを左右に移動 36 keys = pygame.key.get_pressed() 37 if keys[pygame.K_LEFT]: 38 basket_x -= basket_speed 39 if keys[pygame.K_RIGHT]: 40 basket_x += basket_speed 41 42 # リンゴの座標(仮の値) 43 apple_x, apple_y = WIDTH//2, 100 44 45 apple_rect = pygame.Rect(apple_x, apple_y, 20, 20) 46 basket_rect = pygame.Rect(basket_x, basket_y, 50, 20) 47 48 if apple_rect.colliderect(basket_rect): 49 apple_x, apple_y = -100, -100 50 51 # 画面をクリア 52 screen.fill((255, 255, 255)) 53 54 # リンゴを描画 55 for apple_x, apple_y in apples: 56 pygame.draw.circle(screen, (255, 0, 0), (apple_x, int(apple_y)), 20) 57 # かごを描画 58 pygame.draw.rect(screen, (0, 0, 255), pygame.Rect(basket_x, basket_y, 50, 20)) 59 60 pygame.display.flip() 61 pygame.time.Clock().tick(60)

試したこと

リンゴの●とかごの■の当たり判定を書いてみたのですが、籠をすりぬけて、消えてくれません。kill()ではリンゴが、ウィンドウから消えないようです。マイナス(-)もしたけどダメでした。

補足情報(FW/ツールのバージョンなど)

Pygame2.1.2(Python3.10.4)

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

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

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

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

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

guest

回答1

0

ベストアンサー

かごと接触したリンゴを apples から削除します。(削除されたリンゴは描画されません) また、画面外へ移動したリンゴは除去しておきます。

python

1 # リンゴを下に移動 2 new_apples = [] 3 for apple_x, apple_y in apples: 4 apple_y += apple_speed 5 # 画面外へ移動したリンゴは追加しない 6 if apple_y < HEIGHT: 7 new_apples.append((apple_x, apple_y)) 8 apples = new_apples 9 # かごを左右に移動 10 keys = pygame.key.get_pressed() 11 if keys[pygame.K_LEFT]: 12 basket_x -= basket_speed 13 if keys[pygame.K_RIGHT]: 14 basket_x += basket_speed 15 16 # かごと接触したリンゴを消去 17 overlap = [] 18 basket_rect = pygame.Rect(basket_x, basket_y, 50, 20) 19 for i, (apple_x, apple_y) in enumerate(apples): 20 apple_rect = pygame.Rect(apple_x-20, apple_y-20, 40, 40) 21 if apple_rect.colliderect(basket_rect): 22 overlap.append(i) 23 24 for i in overlap: 25 del apples[i] 26 27 # 画面をクリア 28 screen.fill((255, 255, 255))

投稿2024/02/20 15:05

編集2024/02/20 16:14
melian

総合スコア19679

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

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

Jun1971

2024/02/21 09:18

 どうもありがとうございました。おかげでリンゴが消えるようになりました。こういうコードが必要だったんですね。分かりやすくて納得しました。結構、複雑に書かないといけないんですね。これからもPygame のプログラムを作り続けたいと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問