예제 #1
0
    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)
예제 #2
0
    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