Harvey
Harvey

Reputation: 384

Pygame collision detect with object and rect

Yep, I'm asking another question about this program :D

Anyway, I currently a program that creates two lines on the screen with a gap in between them that can scroll. From here, I obviously need to see if the two objects are colliding. Since I only have one sprite and one rectangle I thought it was slightly pointless and overkill to make two classes for them. However, I can only find tutorials relating to classes which I obviously don't need. So, my question really is: Is it possible to test for collision between a standard image and a Pygame rect? If it is not, how can I convert either the image, rectangle or both the sprites to do this. (All preferably without using classes.)

Note: the image and rectangle are created in the following ways (if it makes a difference)

bird = pygame.image.load("bird.png").convert_alpha()
pipeTop = pygame.draw.rect(screen, (0,200,30), Rect((scrollx,0),(30,height)))
pipeBottom = pygame.draw.rect(screen, (0,200,30), Rect((scrollx,900),(30,-bheight)))

Upvotes: 3

Views: 9208

Answers (2)

ZenOfPython
ZenOfPython

Reputation: 901

You can just get the x and y values and compare them:

if pipe.x < bird.x < pipe.x+pipe.width:
    #collision code
    pass

Upvotes: 2

Bartlomiej Lewandowski
Bartlomiej Lewandowski

Reputation: 11170

An image by itself does not have a position. You cannot test collision between a rect and something that is not placed in the world. I would recommend to create a class Bird along with a class Pipe that will both subclass pygame.Sprite.

Pygame already has collision detection built in.

A short example

bird = Bird()
pipes = pygame.Group()
pipes.add(pipeTop)
pipes.add(pipeBottom)

while True:    
    if pygame.sprite.spritecollide(bird,pipes):
        print "Game Over"

EDIT:

Don't be afraid of classes, you will have to use them anyways sooner or later. If you really don't want to use sprites, you can use the birds rect and the pipe and call collide_rect to check if they overlap.

EDIT2:

an example Bird class modified from pygame docs

class Bird(pygame.sprite.Sprite):
    def __init__(self):
       pygame.sprite.Sprite.__init__(self)

       self.image = pygame.image.load("bird.png").convert_alpha()

       # Fetch the rectangle object that has the dimensions of the image
       # Update the position of this object by setting the values of rect.x and rect.y
       self.rect = self.image.get_rect()

You could then add methods such as move, which will move the bird down with the force of gravity.

The same would apply for the Pipe but instead of loading an image, you can create an empty Surface, and fill it with a color.

image = pygame.Surface(width,height)
image.fill((0,200,30)

Upvotes: 4

Related Questions