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

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

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

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

Q&A

解決済

1回答

1000閲覧

ボールがブロックにあたるとブロックが消えるようにしたい

kkashi89sk

総合スコア12

Python

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

0グッド

0クリップ

投稿2020/11/21 07:19

tmp_blocks = []

for block in blocks:
if ball.rect.colliderect(block.rect) != True:
tmp_blocks.append(block)

blocks = tmp_blocks
ここが働いてないのでしょうか。ブロックが消えません。どうすればいいでしょう

import sys import pygame import math from pygame.locals import QUIT from pygame.locals import Rect pygame.init() SURFACE = pygame.display.set_mode((400,300)) FPSCLOCK = pygame.time.Clock() class Block: def __init__(self, color, rect): #コンストラクタ self.color = color #ボールの色(R,G,B) self.rect = rect #初期位置と大きさ(Rectを利用) #描画するメソッド def draw(self): pygame.draw.rect(SURFACE, self.color, self.rect) class Ball: def __init__(self, color, rect,dir=320,speed=10): self.color = color #ボールの色(R,G,B) self.rect = rect #初期位置と大きさ(Rect を利用) self.dir = dir self.speed = speed def draw(self): pygame.draw.ellipse(SURFACE, self.color, self.rect) def move(self): if self.rect.centerx < 0 or self.rect.centerx > 400: self.dir = 180-self.dir if self.rect.centery < 0 or self.rect.centery > 300: self.dir = -self.dir self.rect.centerx += math.cos(math.radians(self.dir))*self.speed self.rect.centery -= math.sin(math.radians(self.dir))*self.speed #Block オブジェクトの生成 left = 50 top = 50 width = 45 height = 20 color = (200, 50, 200) blocks = [] for i in range(6): rect = Rect(left,top,width,height) blocks.append(Block(color,rect)) left = left + 50 #Ball オブジェクトの生成 ball_rect = Rect(150,100,10,10) ball_color = (255,255,0) ball = Ball(ball_color, ball_rect, 320, 10) tmp_blocks = [] #一時的なリストを tmp_blocks を作成して for block in blocks: #blocks の中から、衝突していない block を tmp_blocks に追加し if ball.rect.colliderect(block.rect) != True: tmp_blocks.append(block) blocks = tmp_blocks #tmp_blocks を blocks に代入することで、blocks リストを更新 while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() SURFACE.fill((0,0,0)) ball.move() for block in blocks: block.draw() ball.draw() pygame.display.update() FPSCLOCK.tick(30) コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

ブロックが消えません。どうすればいいでしょう

この衝突判定が while True: 処理内にないことが原因ですね。

Python

1 ball.move() 2 tmp_blocks = [] #一時的なリストを tmp_blocks を作成して 3 for block in blocks: #blocks の中から、衝突していない block を tmp_blocks に追加し 4 if ball.rect.colliderect(block.rect) != True: 5 tmp_blocks.append(block) 6 blocks = tmp_blocks #tmp_blocks を blocks に代入することで、blocks リストを更新

と ball.move() の後に移動しましょう。

投稿2020/11/21 08:17

lehshell

総合スコア1147

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

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

kkashi89sk

2020/11/21 09:35

出来ました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問