Skip to main content
added 20 characters in body
Source Link

Instead of having a detectCollisionsmethod that takes x1, y1, w1, h1, x2, y2, w2 and h2, at the sprite initialization you could set its Rect, move and blit itthe sprite using thatthis same Rect as argument to blit, and thenand check for collisions with something as simple as:

Instead of having a detectCollisionsmethod that takes x1, y1, w1, h1, x2, y2, w2 and h2, at the sprite initialization you could set its Rect, move and blit it using that same Rect as argument to blit, and then check for collisions with:

Instead of having a detectCollisionsmethod that takes x1, y1, w1, h1, x2, y2, w2 and h2, at the sprite initialization you could set its Rect, move and blit the sprite using this same Rect as argument, and check for collisions with something as simple as:

Source Link

The Pygame Rect already comes with a few collision detection functions that may just do what you need:

  • pygame.Rect.contains: test if one rectangle is inside another
  • pygame.Rect.collidepoint: test if a point is inside a rectangle
  • pygame.Rect.colliderect: test if two rectangles overlap
  • pygame.Rect.collidelist: test if one rectangle in a list intersects
  • pygame.Rect.collidelistall: test if all rectangles in a list intersect
  • pygame.Rect.collidedict: test if one rectangle in a dictionary intersects
  • pygame.Rect.collidedictall: test if all rectangles in a dictionary intersect

Instead of having a detectCollisionsmethod that takes x1, y1, w1, h1, x2, y2, w2 and h2, at the sprite initialization you could set its Rect, move and blit it using that same Rect as argument to blit, and then check for collisions with:

sprite1.rect.colliderect(sprite2.rect)

From a A Newbie Guide to pygame:

Rects are your friends.

[...] I have to admit my favorite part of pygame is the lowly Rect class. A rect is simply a rectangle – defined only by the position of its top left corner, its width, and its height. Many pygame functions take rects as arguments, and they also take ‘rectstyles’, a sequence that has the same values as a rect. So if I need a rectangle that defines the area between 10, 20 and 40, 50, I can do any of the following:

rect = pygame.Rect(10, 20, 30, 30)
rect = pygame.Rect((10, 20, 30, 30))
rect = pygame.Rect((10, 20), (30, 30))
rect = (10, 20, 30, 30)
rect = ((10, 20, 30, 30))

If you use any of the first three versions, however, you get access to Rect’s utility functions. These include functions to move, shrink and inflate rects, find the union of two rects, and a variety of collision-detection functions.

For example, suppose I’d like to get a list of all the sprites that contain a point (x, y) – maybe the player clicked there, or maybe that’s the current location of a bullet. It’s simple if each sprite has a .rect member – I just do:

sprites_clicked = [sprite for sprite in all_my_sprites_list
                   if sprite.rect.collidepoint(x, y)]

Rects have no other relation to surfaces or graphics functions, other than the fact that you can use them as arguments. You can also use them in places that have nothing to do with graphics, but still need to be defined as rectangles. Every project I discover a few new places to use rects where I never thought I’d need them.

So unless you have a specific reason not to rely on Pygame Rect and its functions, my suggestion would be: don't reinvent the wheel, stick with it.

They might even make use of some internal c code that provides better performance then implementing a pure python approach, although I'm not sure about this specific point.