2016-07-16 11 views
1

Ich arbeite derzeit an einem Spiel auf Pygame, Python 3 und einer der wesentlichen Teile des Spiels ist die Kollision von Rects in einer bullet-Ziel-Situation.Colorkey Kollision zwischen Rects in Pygame, Python 3

Dies ist ziemlich einfach mit der colliderect Funktion zu erreichen, aber es ist notwendig, dass die Pixel, die die gleiche Farbe wie die Farbe haben, nicht gezählt werden.

Wenn beispielsweise eines der Sprites (das Zeichen) die Form eines großen gleichschenkligen Dreiecks hat, dessen Basis horizontal ist und eine Kugel von oben links kommt, würde colliderect die Kollision sofort erkennen Die Pixel in der oberen linken Ecke des Sprites des Spielers sind transparent.

Ich muss eine Funktion erstellen, die nur dann auf Kollision erkennt, wenn das Geschoss Pixel erreicht hat, die eine andere Farbe als die Farbe haben. Dies ist leicht genug, wenn die Kugel nur ein Pixel ist:

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

Ich habe versucht, die obige Aussage für jedes Pixel in der Kugel laufen, aber natürlich, dass umfangreiche Verzögerung verursacht. Gibt es einen anderen, effizienteren Weg?

Vielen Dank im Voraus!

Antwort

1

einen Blick auf die collide_mask Funktion haben:

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

Kurz Sie jeweils ein self.mask Attribut Sprite geben (mit pygame.mask.from_surface()) - was Sie können eine colorkey zu tun mit oder pro Pixel Alpha. Dann schließen Sie es als einen Rückruf für die spritecollide Funktion wie so:

pygame.sprite.spritecollide (Spieler, Kugeln, True, pygame.sprite.collide_mask)

hoffe, das hilft!

0

ich es geschafft, einen Algorithmus zu machen, die an den Ecken jedes rect aussieht:

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 

wahrscheinlich nicht die effcient Art und Weise, aber es mein Problem gelöst :)