Re: [pygame] Pixel Perfect collision suggestion.
Sure, John! We could also submit this patch to pygame, thereby making the basic collision system faster. What say we make a patch? Regards, Karthik John Eriksson wrote: You are right! Your algorithm is actually a bit faster :-D At first it seems you've added some extra loops but when looking closer I saw that you're code check edges first instead of roaming thourgh the pixels top to bottom. Well done! I would like to include your algorithm in the PixelPerfect example if its ok with you? Best Regards /John
Re: [pygame] Pixel Perfect collision suggestion.
@John No, there isn't any. @Kamilche: Rectangular/polygon collision is much faster than pixel perfect collision. But ppcol is a viable alternative in certain games such as street fighter or mk (the older ones) Just an idea here. It would be nice if we did have different coll-d algorithms in pygame; because people do a variety of games. Especially rectangular, circular, convex-polygon and ppcol methods. Regards John Eriksson wrote: I didn't now there where any pixel perfect collision code in pygame? /John ons 2007-01-31 klockan 15:13 +0530 skrev V. Karthik Kumar: Sure, John! We could also submit this patch to pygame, thereby making the basic collision system faster. What say we make a patch? Regards, Karthik John Eriksson wrote: You are right! Your algorithm is actually a bit faster :-D At first it seems you've added some extra loops but when looking closer I saw that you're code check edges first instead of roaming thourgh the pixels top to bottom. Well done! I would like to include your algorithm in the PixelPerfect example if its ok with you? Best Regards /John
Re: [pygame] Pixel Perfect collision suggestion.
Okay, I modified the code a little bit more. This takes care of the odd number of rows/columns in the intersection window. I guess there shouldn't me any more changes in this. Regards def pp_collide(obj1,obj2): If the function finds a collision it will return True if not it will return False. rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, obj2.hitmask if not rect1.colliderect(rect2): return False rect = rect1.clip(rect2) w, h, x1, y1, x2, y2 = rect.width, rect.height, rect.x-rect1.x, rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y if w%2: for y in range(h): if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: return True w=w-1 if h%2: for x in range(w): if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: return True h=h-1 while w 0 and h 0: for x in range(w): if hm1[x1+x][y1] and hm2[x2+x][y2]: return True if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: return True for y in range(1, h-1): if hm1[x1][y1+y] and hm2[x2][y2+y]: return True if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: return True w, h, x1, y1, x2, y2 = w-2, h-2, x1+1, y1+1, x2+1, y2+1 return False
Re: [pygame] Pixel Perfect collision suggestion.
V. Karthik Kumar wrote: I happened to read the changes list a day ago. I saw the code, I thought that this change might help detect regular pp cols faster. This version keeps checking pixels from the outer rectangle of the colliding area to the inner. It works considerably faster when objects are regular and convex, which is often the case. This isn't a patch as such, I'd recommend people try it out and report the results and then decide. Regards, Karthik def pp_collide(obj1,obj2): If the function finds a collision it will return True if not it will return False. rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, obj2.hitmask if not rect1.colliderect(rect2): return False rect = rect1.clip(rect2) w, h, x1, y1, x2, y2 = rect.width, rect.height, rect.x-rect1.x, rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y while w 0 and h 0: for x in range(w): if hm1[x1+x][y1] and hm2[x2+x][y2]: return True if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: return True for y in range(1, h-1): if hm1[x1][y1+y] and hm2[x2][y2+y]: return True if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: return True w, h, x1, y1, x2, y2 = w-2, h-2, x1+1, y1+1, x2+1, y2+1 return False Is it faster than pygame's builtin rect.collidepoint method?
Re: [pygame] Pixel Perfect collision suggestion.
Hi, If you're looking for a pixel perfect collision detection algorithm, there is a project at pygame which contains an even faster one. PixelPerfect - http://www.pygame.org/projects/9/207/ It also contains some replacements methods for spritecollide, groupcollide and spritecollideany and an example to show how to use it. The algorithm was used in one of the Second Pyweek Challenge winners! Trip on the Funny Boat - http://www.pygame.org/projects/20/235/ Best Regards /John Eriksson tis 2007-01-30 klockan 06:30 -0800 skrev Kamilche: V. Karthik Kumar wrote: I happened to read the changes list a day ago. I saw the code, I thought that this change might help detect regular pp cols faster. This version keeps checking pixels from the outer rectangle of the colliding area to the inner. It works considerably faster when objects are regular and convex, which is often the case. This isn't a patch as such, I'd recommend people try it out and report the results and then decide. Regards, Karthik def pp_collide(obj1,obj2): If the function finds a collision it will return True if not it will return False. rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, obj2.hitmask if not rect1.colliderect(rect2): return False rect = rect1.clip(rect2) w, h, x1, y1, x2, y2 = rect.width, rect.height, rect.x-rect1.x, rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y while w 0 and h 0: for x in range(w): if hm1[x1+x][y1] and hm2[x2+x][y2]: return True if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: return True for y in range(1, h-1): if hm1[x1][y1+y] and hm2[x2][y2+y]: return True if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: return True w, h, x1, y1, x2, y2 = w-2, h-2, x1+1, y1+1, x2+1, y2+1 return False Is it faster than pygame's builtin rect.collidepoint method?
Re: [pygame] Pixel Perfect collision suggestion.
You are right! Your algorithm is actually a bit faster :-D At first it seems you've added some extra loops but when looking closer I saw that you're code check edges first instead of roaming thourgh the pixels top to bottom. Well done! I would like to include your algorithm in the PixelPerfect example if its ok with you? Best Regards /John tis 2007-01-30 klockan 20:28 +0530 skrev V. Karthik Kumar: Hi John, The code that was given is a modified version of PixelPerfect. Please look into it. :) I noticed that the code that i posted is probably doing redundant comparisons for odd pixel width/height collision rectangles (when reduced to 1 x h ow w x 1 ), which I'll modify. Regards John Eriksson wrote: Hi, If you're looking for a pixel perfect collision detection algorithm, there is a project at pygame which contains an even faster one. PixelPerfect - http://www.pygame.org/projects/9/207/ It also contains some replacements methods for spritecollide, groupcollide and spritecollideany and an example to show how to use it. The algorithm was used in one of the Second Pyweek Challenge winners! Trip on the Funny Boat - http://www.pygame.org/projects/20/235/ Best Regards /John Eriksson tis 2007-01-30 klockan 06:30 -0800 skrev Kamilche: V. Karthik Kumar wrote: I happened to read the changes list a day ago. I saw the code, I thought that this change might help detect regular pp cols faster. This version keeps checking pixels from the outer rectangle of the colliding area to the inner. It works considerably faster when objects are regular and convex, which is often the case. This isn't a patch as such, I'd recommend people try it out and report the results and then decide. Regards, Karthik def pp_collide(obj1,obj2): If the function finds a collision it will return True if not it will return False. rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, obj2.hitmask if not rect1.colliderect(rect2): return False rect = rect1.clip(rect2) w, h, x1, y1, x2, y2 = rect.width, rect.height, rect.x-rect1.x, rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y while w 0 and h 0: for x in range(w): if hm1[x1+x][y1] and hm2[x2+x][y2]: return True if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: return True for y in range(1, h-1): if hm1[x1][y1+y] and hm2[x2][y2+y]: return True if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: return True w, h, x1, y1, x2, y2 = w-2, h-2, x1+1, y1+1, x2+1, y2+1 return False Is it faster than pygame's builtin rect.collidepoint method?