Así que estoy tratando de hacer que la detección de colisiones para mi juego el uso de instancias. Aquí está el código:
class Paddle:
def __init__(self, x, y, width, height, rect):
self.x = x
self.y = y
self.width = width
self.height = height
self.rect = pygame.rect.Rect(x, y, width, height)
class Ball:
coordinateX = 600
coordinateY = 300
velocity = [random.randint(0,1),random.randint(-1,1)]
player = (Paddle(1100, 300, 10, 30, (1100, 300, 10, 30)))
enemy = Paddle(100, 300, 10, 30, (100, 30, 10, 30))
ball = (Ball.coordinateX, Ball.coordinateY, 15)
Y más adelante:
ballRect = pygame.rect.Rect(Ball.coordinateX, Ball.coordinateY, 10, 10)
if pygame.sprite.collide_rect(player, ballRect):
bounce()
En primer lugar, cuando se crea el rect
atributo para su bola, debe ser self.rect = pygame.Rect(x, y, width, height)
(suponiendo importar Pygame con import pygame
). Eso debería manejar su AttributeError
. Lo mismo ocurre con su ballRect
, ballRect = pygame.Rect(Ball.coordinateX, Ball.coordinateY, 10, 10)
.
A continuación, se está utilizando la función de detección de colisión rect mal. pygame.sprite
se refiere a algo completamente diferente en Pygame (sus Sprite
objetos), y ni el Ball
ni Paddle
clase son Pygame Sprites, a partir del código que escribió. Por lo tanto, la llamada pygame.sprite.collide_rect()
no tiene sentido aquí.
En su lugar, simplemente debe utilizar rect.colliderect
, así:
if rect.colliderect(other_rect):
# Colliding!
print("Stop touching me!")
o en su caso:
if player.rect.colliderect(ballRect):
bounce()
Por otra parte, no es necesario pasar una rect
como argumento para su Paddle
inicialización, porque nunca se utiliza. El objeto es rect
por completo genera a partir de sus otros argumentos.
Por último, su Ball
clase y el código de instancias parece un poco fuera poco. Debe generar e inicializarlo como se hace para Paddle
.
EDITAR Una última cosa. En pygame, cuando se crea un objeto con un rect
atributo, ya no es necesario asignar x
y y
valores al objeto, porque cada vez que va a necesitar, por ejemplo, en una blit
, puede simplemente pasar el rect
directamente (o rect.x
, y rect.y
en algunos casos extremos ) como el argumento de posición, y pygame va muy bien manejar el resto.
Esto es lo que el código debe ser similar (con algunas otras cosas fijas):
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()