2016-07-16 1 views
1

Je travaille actuellement sur un jeu sur Pygame, Python 3 et l'une des parties essentielles du jeu est la collision de Rects dans une situation de cible de balle.Colorkey collision entre Rects dans Pygame, Python 3

Ceci est assez facile à réaliser en utilisant la fonction colliderect mais il est nécessaire que les pixels de la même couleur que la couleur ne soient pas comptés. Par exemple, si l'un des sprites (le personnage) a la forme d'un grand triangle équilatéral avec sa base horizontale et une balle venant du coin supérieur gauche, colliderect détecterait immédiatement la collision, même si les pixels en haut à gauche sont de l'image-objet du joueur sont transparents.

Je dois créer une fonction qui détectera une collision uniquement lorsque la balle a atteint des pixels d'une couleur différente de la couleur. Ceci est assez facile si la balle est qu'un seul pixel:

if player.get_at((bullet[0] - player.left, bullet[1] - player.top)) != player.get_colorkey(): 

J'ai essayé itérer la déclaration ci-dessus pour chaque pixel de la balle, mais, bien sûr, qui a provoqué le décalage étendu. Y a-t-il un moyen différent, plus efficace?

Merci d'avance !!

Répondre

1

Jetez un oeil à la fonction collide_mask:

http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.collide_mask

En bref, vous donnez à chacun des sprites un attribut self.mask (en utilisant pygame.mask.from_surface()) - que vous pouvez faire en utilisant un code de couleur ou alpha par pixel. Ensuite, vous incluez comme un rappel pour la fonction spritecollide comme ceci:

pygame.sprite.spritecollide (joueur, balles, vrai, pygame.sprite.collide_mask)

Hope this helps!

0

je réussi à faire un algorithme qui regarde les coins de chaque rect:

def rectsCollideSimple (rect1, surf1, rect2, surf2): 
    collide = False 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.top - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.left - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    try: 
     if surf1.get_at((rect2.right - rect1.left, rect2.bottom - rect1.top)) != surf1.get_colorkey(): 
      collide = True 
    except IndexError: 
     useless = None 
    return collide 

def rectsCollide (rect1, surf1, rect2, surf2): 
    if rectsCollideSimple(rect1, surf1, rect2, surf2) or rectsCollideSimple(rect2, surf2, rect1, surf1): 
     return True 
    else: 
     return False 

Probablement pas la façon la plus effcient, mais il a résolu mon problème :)