[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Mask collision detection



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.blom@xxxxxxxxxxxxxxxxxxx> 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 = "">    background = "">    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()