Reason:
The collision test relies on the rect attribute of the Sprite objects to determine if they intersect. However, the get_rect() method in your code doesn't properly set the position of the rectangle to the intended coordinates.
Solution:
When using get_rect(), you can specify the position with keyword arguments or assign it to the topleft virtual attribute of the rectangle. Use this corrected code:
self.rect = self.image.get_rect(topleft=(self.x, self.y))
Reason:
You added unnecessary x and y attributes to the sprites instead of relying on the position of the rectangle. As a result, the rectangle's position is always set to (0, 0) because Surface objects have no default position.
Solution:
Remove the x and y attributes and use the rect attribute to set the position of the Sprite objects. Here's the corrected code:
class Ball(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("ball.png") self.rect = self.image.get_rect(topleft=(280, 475)) self.col = False
You can further simplify your code by using a pygame.sprite.Group to manage the Sprite objects. This will handle drawing and updating automatically.
obstacle = Obstacle() ball = Ball() # Create a sprite group and add the sprites to it. all_sprites = pygame.sprite.Group([obstacle, ball]) while not crashed: # [... event handling and game logic] gameDisplay.fill((255, 255, 255)) # Draw all sprites using the group's draw method. all_sprites.draw(gameDisplay) # [... other game loop tasks]
The above is the detailed content of Why Does My Pygame Collision Detection Always Return True, and Why Is My Image Rectangle Position Incorrectly Set to (0, 0)?. For more information, please follow other related articles on the PHP Chinese website!