[pygame] Mask collision detection

2010-12-13 Thread Petrovski
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()


Re: [pygame] Mask collision detection

2010-12-13 Thread B W
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.nlwrote:

 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()