web-dev-qa-db-fra.com

Un peu confondu avec blitting (Pygame)

Je viens de commencer à apprendre un pygame (assez nouveau pour la programmation en général), et j'ai des questions très simples sur la façon dont cela fonctionne.

Je n'ai pas encore trouvé d'endroit qui explique quand j'ai besoin de blitter ou de ne pas inclure une certaine surface sur l'écran. Par exemple, lorsque vous dessinez un cercle:

circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

Je n'ai pas besoin de faire screen.blit(circle), mais lors de l'affichage du texte:

text = font.render("TEXT", 1, (10, 10, 10)) 
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)

Si je ne blit pas, le texte n'apparaîtra pas.

Pour être honnête, je ne sais vraiment pas ce que le blitting est censé faire, à part "coller" la surface souhaitée sur l'écran. J'espère avoir été assez clair.

22
Pabce

La réponse courte

Je n'ai pas encore trouvé d'endroit qui explique quand j'ai besoin de blitter ou de ne pas inclure une certaine surface sur l'écran.

Chaque opération se comportera différemment et vous devrez lire la documentation de la fonction avec laquelle vous travaillez.

La réponse longue

Qu'est-ce que Blitting?

Tout d'abord, vous devez comprendre ce que fait le blitting. Votre écran n'est qu'une collection de pixels, et blitting fait une copie complète d'un ensemble de pixels sur un autre. Par exemple, vous pouvez avoir une surface avec une image que vous avez chargée à partir du disque dur et l'afficher plusieurs fois sur l'écran dans différentes positions en fusionnant cette surface au-dessus de la surface screen plusieurs fois.

Donc, vous avez souvent du code comme celui-ci ...

my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)

En deux lignes de code, nous avons copié une tonne de pixels de la surface source (my_image) sur l'écran en "blitting".

Comment fonctionnent les fonctions pygame.draw. *?

Techniquement, les méthodes pygame.draw. * Auraient pu être écrites pour faire quelque chose de similaire. Donc, au lieu de votre exemple ...

pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)

... ils auraient pu vous faire faire ça ...

circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)

Si tel était le cas, vous obtiendriez le même résultat. En interne, cependant, la méthode pygame.draw.circle() manipule directement la surface que vous lui passez plutôt que de créer une nouvelle surface. Cela pourrait avoir été choisi comme moyen de faire les choses car ils pourraient le faire fonctionner plus rapidement ou avec moins de mémoire que la création d'une nouvelle surface.

Alors, que dois-je faire?

Donc, à votre question de "quand blit" et "quand ne pas le faire", en gros, vous devez lire la documentation pour voir ce que fait réellement la fonction.

Voici les documents pygame.draw.circle () :

pygame.draw.circle ():

dessiner un cercle autour d'un point

cercle (Surface, couleur, pos, rayon, largeur = 0) -> Rect

Dessine une forme circulaire sur la surface. L'argument pos est le centre du cercle et le rayon est la taille. L'argument largeur est l'épaisseur pour dessiner le bord extérieur. Si la largeur est nulle, le cercle sera rempli.

Notez qu'il dit que "dessine une forme sur la surface", il a donc déjà fait les changements de pixels pour vous. En outre, il ne renvoie pas de surface (il renvoie un Rect, mais cela vous indique simplement où les modifications de pixels ont été effectuées).

Voyons maintenant la documentation pygame.font.Font.render () :

dessiner du texte sur une nouvelle surface

rendu (texte, antialias, couleur, arrière-plan = Aucun) -> Surface

Cela crée une nouvelle surface avec le texte spécifié rendu dessus. Pygame ne fournit aucun moyen de dessiner directement du texte sur une surface existante: à la place, vous devez utiliser Font.render () pour créer une image (surface) du texte, puis blit cette image sur une autre surface. ...

Comme vous pouvez le voir, il indique spécifiquement que le texte est dessiné sur une NOUVELLE Surface, qui est créée et vous est retournée. Cette surface n'est PAS la surface de votre écran (elle ne peut pas l'être, vous n'avez même pas dit à la fonction render() quelle est la surface de votre écran). C'est une assez bonne indication que vous devrez réellement blit cette surface à l'écran.

45
Mark Hildreth

Blit signifie 'BL'ock' I'mage 'T'ranfser

Lorsque vous afficherez des choses à l'écran, vous utiliserez, d'une certaine manière, screen parce que c'est là que vous le mettez.

Quand vous faites:

pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

vous utilisez toujours l'écran mais vous ne blitez pas parce que pygame le dessine pour vous.

Et lorsque vous utilisez du texte, Pygame le convertit en image, vous devez alors le blit.

Donc, fondamentalement, vous blit des images, mais vous pouvez également demander à Pygame de les dessiner pour vous. Mais souvenez-vous que lorsque vous blittez une image, par exemple sur un arrière-plan, vous devez la reboucler et la quatrième; pour qu'il bloque le fond, puis l'image, puis le fond etc ...

Vous n'avez pas besoin d'en savoir beaucoup plus que cela, mais vous pouvez tout lire ici Pygame Blit

J'espère que cela a aidé. Bonne chance!

11
Serial

Imaginez que vous êtes peintre:

Vous avez une toile et un pinceau.

Disons que la surface de votre écran principal sera votre toile, et toutes les autres surfaces sont "dans votre tête" - vous savez déjà comment les dessiner.

Lorsque vous appelez blit, vous peignez en haut de la surface, couvrant tous les pixels qui se chevauchent. C'est pourquoi vous devez repeindre tout l'écran noir afin de ne pas avoir de taches sur la peinture lors du déplacement d'un objet.

Comme Mark l'a déjà dit, vous pouvez dessiner un cercle avec une fonction, ou d'abord le blit sur une nouvelle surface, et le blit sur la surface de l'écran.

Si vous avez une surface plus compliquée - courbes, texte, etc., vous n'avez pas besoin d'avoir une surface pour cela, vous n'avez donc pas à faire de calculs coûteux, juste à dessiner. Le revers est que votre programme prend plus de mémoire, vous devez donc choisir entre ces 2.

2