AttributeError: objeto 'pygame.Rect' no tiene atributo de error 'rect' cuando se hace la colisión

PiggyTheFirstAstro:

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()
underscoreC:

En primer lugar, cuando se crea el rectatributo 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.spritese refiere a algo completamente diferente en Pygame (sus Spriteobjetos), y ni el Ballni Paddleclase 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 rectcomo argumento para su Paddleinicialización, porque nunca se utiliza. El objeto es rectpor completo genera a partir de sus otros argumentos.

Por último, su Ballclase 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 rectatributo, ya no es necesario asignar xy yvalores al objeto, porque cada vez que va a necesitar, por ejemplo, en una blit, puede simplemente pasar el rectdirectamente (o rect.x, y rect.yen 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()

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=402529&siteId=1
Recomendado
Clasificación