0
\$\begingroup\$

I am writing a game in Pygame and want to get collision detection working. The aim is that when an object hits another, the target object disappears. I want to avoid having classes for now, to keep things simple. This makes it difficult to get collision detection working, because the Rect method in Pygame assumes classes.

The logic I want to achieve is:

if object hits a target object
    target object disappears

What's the minimal code I'd need to achieve this?

\$\endgroup\$

2 Answers 2

2
\$\begingroup\$

I think you mean you don't want to create your own classes such as:

class Player(pygame.sprite.Sprite):
    def __init__(self, rect, image):
        pygame.sprite.Sprite.__init__(self)
        self.rect = rect
        self.image = image

Which is doable, but not a very good practice. With that in mind, here's how you do it.

Create a player sprite:

player = pygame.sprite.Sprite()
# size is 40x40, position is 0, 0
player.rect = pygame.Rect(0, 0, 40, 40)

# image is 40x40 grey block
player.image = pygame.Surface((40, 40))
player.image.fill((60, 60, 60))

Then add a block sprite that the player can collect:

blocks = pygame.sprite.Sprite()
# size is 20x20, position is 300, 300
block.rect = pygame.Rect(300, 300, 20, 20)

# image is 20x20 green block
block.image = pygame.Surface((20, 20))
block.image.fill((60, 200, 60))

With two sprites, pygame.sprite.collide_rect() can be used for collision detection:

if pygame.sprite.collide_rect(player, block):
    # move block to a new position
    block.rect.x = random.randint(20, 480)
    block.rect.y = random.randint(20, 480)
    print "You ate a block!"

The sprites can be drawn on the screen like this:

# topleft is the position of the top left corner of the sprite
screen.blit(block.image, block.rect.topleft)
screen.blit(player.image, player.rect.topleft)

Here's a fully working example.

\$\endgroup\$
0
\$\begingroup\$

Another approach (If you don't want to use sprite for whatever reasons) is to write your own collision detection logic. The logic will basically check if difference in x and y co-ordinates of each rect objects is within the delta. The delta is width and height of one of the objects capturing collision.

from math import fabs
def has_collided_with(rect1,rect2):
    deltay = fabs(rect1.centery - rect2.centery)
    deltax = fabs(rect1.centerx - rect2.centerx)
    return deltay < rect2.height and deltax < rect2.width
\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.