Howdy, Put your background image in a sprite object and add a mask attribute, just like you do for Blok objects.
Then test for collisions with pygame.sprite.collide_mask. Gumm On Mon, Dec 13, 2010 at 1:27 AM, Petrovski <peter.b...@tweakedsolutions.nl>wrote: > Hi, > > I´m having some trouble with detecting collisions between 2 masks. > > What i´m trying to do is create a sort of a terrain with a polygon, > then drop a box that should keep dropping until it hits the "terrain". > > With the following code I get 2 masks that when checked with > mask.count() are greater than 0. > > Problem is they are not detecting each other. I tried both > pygame.mask.from_threshold and pygame.mask.from_surface to make a mask > of the polygon. For overlapping detection I tried Mask.overlap_area > and Mask.overlap. Both did not work. > > Any help would be greatly appreciated > > This is my code: > +-------------------------Main class: > import pygame > import Blok > from pygame.locals import * > > def main(): > > pygame.init() > > screen = pygame.display.set_mode((750, 500)) > pygame.display.set_caption('Spike 2') > > #Backgrounds > background2 = pygame.Surface(screen.get_size()) > background2 = background2.convert() > background2.fill((0, 0, 250)) > > background = pygame.Surface(screen.get_size()) > background = background.convert() > background.fill((0, 0, 250)) > background.set_colorkey((0, 0, 250), RLEACCEL) > > #Make the terrain polygon > area = [(0, 300), (290, 475), (450, 200), (550,475),(750,350), > (750,500),(0,500)] > colour = (250, 0, 0) > pygame.draw.polygon(background, colour, area) > > clock = pygame.time.Clock() > zoneObjectSprites = pygame.sprite.RenderPlain() > > while 1: > clock.tick(60) > > for event in pygame.event.get(): > if event.type == QUIT: > return > elif event.type == KEYDOWN and event.key == K_ESCAPE: > return > if event.type == MOUSEBUTTONDOWN: > if event.button == 3: > #spawn a box at the cursor position > mX, mY = pygame.mouse.get_pos() > Blok.Blok(mX,mY).add(zoneObjectSprites) > > #Blue background and terrain > screen.blit(background2, (0, 0)) > screen.blit(background, (0, 0)) > > #Get the mask of the terrain > #terrainmask = pygame.mask.from_threshold(background, colour, > (1, 1, 1)) > terrainmask = pygame.mask.from_surface(background) > > #print the mask count to see if its big enough > print terrainmask.count() > for object in zoneObjectSprites: > object.gravity(terrainmask) > zoneObjectSprites.draw(screen) > pygame.display.flip() > > #this calls the 'main' function when this script is executed > if __name__ == '__main__': main() > > > +-------------------------Blok class: > class Blok(pygame.sprite.Sprite): > > def __init__(self, X, Y): > pygame.sprite.Sprite.__init__(self) > self.image, self.rect = load_image('blok1.bmp',-1) > screen = pygame.display.get_surface() > self.area = screen.get_rect() > self.rect.center = X, Y > self.gravityForce = 3 > self.mask = pygame.mask.from_surface(self.image,255) > print self.mask.count() > > def gravity(self,terrainmask): > dy = self.mask.overlap(terrainmask,(0,0)) > print dy > > #did we hit the ground? > if dy is not None: > print 'hit ground' > else: > newpos = self.rect.move((0, self.gravityForce)) > self.rect = newpos > > #kill object if it goes offscreen > if self.rect.top > 500: > self.kill() >