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

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

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

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

Python

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

Q&A

解決済

1回答

1247閲覧

ボールがパドルとぶつかった後にボールを跳ね返らせるにはどうすればよいですか?

teslabee

総合スコア2

Pygame

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

Python

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

0グッド

0クリップ

投稿2021/12/11 07:46

私はPythonのブロック崩しゲームに取り組んでおり、キーボードで自由に動かすことができるパドル、ブロック、ボールをすでに作成しています。ボールはブロックに当たることができ、ウインドウに​​当たることはできますが、パドルに当たることはできません。 パドルを通り抜けて、パドルの下のウインドウにぶつかって、跳ね返るだけです。今どうしたらいいのかわからないです。

import

1import pygame 2from pygame.locals import QUIT, KEYDOWN, K_LEFT, K_RIGHT 3from pygame.locals import Rect 4import math 5pygame.init() 6SURFACE = pygame.display.set_mode((400,300)) 7pygame.display.set_caption("Game Window") 8FPSCLOCK = pygame.time.Clock() 9class Block: 10 def __init__(self, color, rect): 11 self.color = color 12 self.rect = rect 13 def draw(self): 14 pygame.draw.rect(SURFACE, self.color, self.rect) 15 def delete(self): 16 blocks.remove(block) 17pw = 40 18ph = 5 19paddle = Block((0, 0, 255),Rect(180, 295,pw, ph)) 20pygame.key.set_repeat(30, 30) 21class Ball: 22 def __init__(self,a,b,c,d): 23 self.color=a 24 self.rect=b 25 self.dir=c 26 self.speed=d 27 def draw(self): 28 pygame.draw.ellipse(SURFACE, ball_color, ball_rect) 29 def move(self): 30 ball_rect.centerx += math.cos(math.radians(self.dir))*self.speed 31 ball_rect.centery -= math.sin(math.radians(self.dir))*self.speed 32 if ball_rect.centerx <=0 or ball_rect.centerx >= 400: 33 self.dir = 180 - self.dir 34 if ball_rect.centery <= 0 or ball_rect.centery >= 300: 35 self.dir = -self.dir 36 def bounce(self): 37 self.dir -= 180 38left=6 39top=30 40width=45 41height=20 42color=(200,50,200) 43blocks = [] 44for i in range(4): 45 for j in range(8): 46 rect = Rect(left, top, width, height) 47 blocks.append(Block(color, rect)) 48 left += 49 49 left = 6 50 top += 24 51ball_rect = Rect(150,100,10,10) 52ball_color = (255,255,0) 53ball = Ball(ball_color, ball_rect, 60, 5) 54num=0 55while True: 56 SURFACE.fill((0,0,0)) 57 for event in pygame.event.get(): 58 if event.type == QUIT: 59 pygame.quit() 60 sys.exit() 61 elif event.type == KEYDOWN: 62 if event.key == K_LEFT and paddle.rect.centerx-pw/2 > 0: 63 paddle.rect.centerx -= 10 64 elif event.key == K_RIGHT and paddle.rect.centerx+pw/2 < 400: 65 paddle.rect.centerx += 10 66 SURFACE.fill((0,0,0)) 67 paddle.draw() 68 for block in blocks: 69 block.draw() 70 ball.draw() 71 ball.move() 72 for block in blocks: 73 if ball.rect.colliderect(block.rect)==True: 74 Block.delete(blocks) 75 ball.bounce() 76 pygame.display.update() 77 FPSCLOCK.tick(60) 78コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の場所で、ボールがブロックにぶつかったときに跳ね返るようにしています。

python

1 ball.move() 2 for block in blocks: 3 if ball.rect.colliderect(block.rect)==True: 4 Block.delete(blocks) 5 ball.bounce()

このfor文の後で、パドルにぶつかったかどうか判定してぶつかったら反転するようにすればいいでしょう。

ボールにぶつかったかどうかが、「ball.rect.colliderect(block.rect)==True」でわかるのですから、paddleについても同様にすればパドルにぶつかったかどうかわかるはずですね。

投稿2021/12/11 14:51

TakaiY

総合スコア12765

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

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

teslabee

2021/12/12 02:44

AttributeError: 'Block' object has no attribute 'bounce'というエラーが出てきました。 import sys import pygame from pygame.locals import QUIT, KEYDOWN, K_LEFT, K_RIGHT from pygame.locals import Rect import math pygame.init() SURFACE = pygame.display.set_mode((400,300)) pygame.display.set_caption("Game Window") FPSCLOCK = pygame.time.Clock() class Block: def __init__(self, color, rect): self.color = color self.rect = rect def draw(self): pygame.draw.rect(SURFACE, self.color, self.rect) def delete(self): blocks.remove(block) pw = 40 ph = 5 paddle = Block((0, 0, 255),Rect(180, 295,pw, ph)) pygame.key.set_repeat(30, 30) class Ball: def __init__(self,a,b,c,d): self.color=a self.rect=b self.dir=c self.speed=d def draw(self): pygame.draw.ellipse(SURFACE, ball_color, ball_rect) def move(self): self.rect.centerx += math.cos(math.radians(self.dir))*self.speed self.rect.centery -= math.sin(math.radians(self.dir))*self.speed 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 def bounce(self): self.dir -= 180 class Paddle: def __init__(self,e,f): self.rect=e self.dir=f def draw(self): pygame.draw.line(SURFACE,self.e,self.f) def bounce(self): self.dir -= 180 left=6 top=30 width=45 height=20 color=(200,50,200) blocks = [] for i in range(4): for j in range(8): rect = Rect(left, top, width, height) blocks.append(Block(color, rect)) left += 49 left = 6 top += 24 ball_rect = Rect(150,100,10,10) ball_color = (255,255,0) ball = Ball(ball_color, ball_rect, 60, 5) num=0 while True: SURFACE.fill((0,0,0)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: if event.key == K_LEFT and paddle.rect.centerx-pw/2 > 0: paddle.rect.centerx -= 10 elif event.key == K_RIGHT and paddle.rect.centerx+pw/2 < 400: paddle.rect.centerx += 10 SURFACE.fill((0,0,0)) paddle.draw() for block in blocks: block.draw() ball.draw() ball.move() for block in blocks: if ball.rect.colliderect(block.rect)==True: Block.delete(blocks) ball.bounce() if ball.rect.colliderect(paddle.rect)==True: paddle.bounce() pygame.display.update() FPSCLOCK.tick(60)
TakaiY

2021/12/12 04:21 編集

(ここにコードを貼られても読みにくのですが) 'Block' object has no attribute 'bounce'ってのは、Blockオブジェクトはbounceできませんということで、追加した処理を見ると、 if ball.rect.colliderect(paddle.rect)==True: paddle.bounce() これで、ここで、バドルををbounceさせようとしてますよね。paddleばBlockクラスのオブジェクトですが、bounceメソッドは持ってません。 そもそも、bounce(反射)させるのは、paddleでなくて、ballですよね。 なので、ここは、 ball.bounce() としなければなりません。
teslabee

2021/12/14 05:54

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問