Прежде всего, при создании атрибута rect
для вашего шара, он должен быть self.rect = pygame.Rect(x, y, width, height)
(при условии, что вы импортируете Pygame с import pygame
). Это должно обработать ваш AttributeError
. То же самое касается ваших ballRect
, ballRect = pygame.Rect(Ball.coordinateX, Ball.coordinateY, 10, 10)
.
Далее вы используете неправильную функцию обнаружения столкновений прямоугольника. pygame.sprite
относится к чему-то совершенно другому в Pygame (его объектам Sprite
), и ни ваш класс Ball
, ни Paddle
не являются спрайтами Pygame из написанного вами кода. Таким образом, вызывать pygame.sprite.collide_rect()
здесь не имеет смысла.
Вместо этого вы должны просто использовать rect.colliderect
, например, так:
if rect.colliderect(other_rect):
# Colliding!
print("Stop touching me!")
или в вашем случае:
if player.rect.colliderect(ballRect):
bounce()
Кроме того, вам не нужно передавать rect
в качестве аргумента для вашей Paddle
инициализации, потому что он никогда не используется. rect
объекта полностью сгенерирован из других ваших аргументов.
Наконец, ваш класс Ball
и код создания экземпляра кажутся немного не соответствующими. Вы должны сгенерировать и инициализировать его, как вы делаете для Paddle
.
РЕДАКТИРОВАТЬ И последнее. В pygame, когда вы создаете объект с атрибутом rect
, вам больше не нужно присваивать объекту значения x
и y
, потому что всякий раз, когда они вам понадобятся, скажем, в blit
, вы можете просто передать rect
напрямую (или rect.x
и rect.y
в некоторых крайних случаях) в качестве аргумента position, и pygame прекрасно справится с остальными.
Вот как должен выглядеть ваш код (с исправлено еще несколько вещей):
class Paddle():
def __init__(self, x, y, width, height):
self.width = width
self.height = height
self.rect = pygame.Rect(x, y, width, height)
class Ball():
def __init__(self, x, y, width, height):
self.rect = pygame.Rect(x, y, width, height)
self.velocity = [random.randint(0,1),random.randint(-1,1)]
player = Paddle(1100, 300, 10, 30)
enemy = Paddle(100, 300, 10, 30)
ball = Ball(600, 300, 10, 10)
# Other stuff
# Collision checking
if player.rect.colliderect(ball.rect):
bounce()