The [Pygame `Rect`](http://www.pygame.org/docs/ref/rect.html) 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 `detectCollisions`method 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: sprite1.rect.colliderect(sprite2.rect) From a [A Newbie Guide to pygame](https://www.pygame.org/docs/tut/newbieguide.html): > **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.