def detectCellHitbox(cls, creature: Creature) -> None: for i in range(len(cls.all_cells) - 1, -1, -1): cell_i = cls.all_cells[i] if Vect2d.distSq(creature.pos, cell_i.pos) < (creature.radius + cell_i.radius)**2: creature.score += cell_i.score cls.deleteCell(i)
def imgToCircle(cls, img: pygame.Surface) -> pygame.Surface: """Méthode transformant l'image de base afin de la rendre ronde et d'ajouter la transparence Args: img (pygame.Surface): image carrée à transformer en cercle Returns: circle_surface (pygame.Surface): surface circulaire """ width = img.get_width() height = img.get_height() if width == height: size = width else: msg = "L'image n'est pas un carré. Dimensions: ({0},{1})".format( width, height) raise ValueError(msg) # Vérification des dimensions circle_surface = pygame.Surface((size + 1, size + 1), pygame.SRCALPHA) # On crée le cercle center = Vect2d(size / 2, size / 2) radius = int(size / 2) for x in range(size): for y in range(size): pos = Vect2d(x, y) if Vect2d.distSq(pos, center) < radius**2: color = img.get_at((x, y)) # Si le pixel est dans le cercle de destination on prend sa couleur if color[3] != 255: color[3] = 255 # On supprime la transparence if color == Color.TO_TRANSPARENT: # Cette couleur est une valeur spéciale qui sera remplacée par de la # transparence à l'écran, il ne faut donc pas que l'image originale en # contienne print("L'image contient des pixels transparents") color[0] += 1 else: color = Color.TRANSPARENT # Si l'on est hors du cercle on prend comme couleur transparent pygame.gfxdraw.pixel(circle_surface, x, y, color) # On dessine le pixel pygame.gfxdraw.aacircle(circle_surface, int(size / 2), int(size / 2), radius, Color.RED) # On dessine un cercle ayant de l'anti-aliasing pour délimiter la bordure du skin circle_surface.set_colorkey(Color.TO_TRANSPARENT) # On supprime la couleur indésirable # NOTE: même si ce rendu est plus rapide que l'affichage d'un pixel transparent et donc # préférable, il est incompatible avec l'anti-aliasing. Par soucis d'esthetique on # privilégiera donc ici l'affichage de pixels transparents circle_surface = circle_surface.convert_alpha() # On précise que cette image accepte la transparence return circle_surface