Il s’agit de la deuxième partie d’une série de tutoriels en cinq parties sur la création de jeux avec Python 3 et Pygame. Dans la première partie, j'ai présenté la série, abordé les bases de la programmation de jeux, présenté Pygame et examiné l'architecture du jeu..
Dans cette partie, nous examinerons le TextObject
classe utilisée pour rendre le texte à l'écran. Nous allons créer la fenêtre principale, y compris une image d'arrière-plan, puis apprendre à dessiner des objets tels que des briques, la balle et la palette..
le TextObject
La classe est conçue pour afficher du texte à l'écran. On pourrait faire valoir que, du point de vue de la conception, il devrait s'agir d'une sous-classe de GameObject
comme c'est aussi un objet visuel et que vous voudrez peut-être le déplacer. Mais je ne voulais pas introduire de hiérarchies de classes profondes, lorsque tout le texte affiché par Breakout reste à l'écran..
le TextObject
crée un objet de police. Il rend le texte dans une surface de texte séparée qui est ensuite blittée (rendue) sur la surface principale. Un aspect intéressant de la TextObject
est-ce qu'il n'a pas de texte fixe. Au lieu de cela, il obtient une fonction appelée text_func ()
qui s'appelle chaque fois qu'il rend.
Cela nous permet de mettre à jour l'affichage des vies et des scores dans Breakout simplement en fournissant une fonction qui renvoie les vies et les scores actuels, au lieu de garder trace des objets texte affichant les vies et les scores et de mettre à jour leur texte chaque fois qu'ils changent. C'est une astuce de la programmation fonctionnelle, et pour les grands jeux, cela peut vous aider à tout garder bien rangé.
importer une classe pygame TextObject: def __init __ (self, x, y, text_func, color, nom_ font, taille_font): self.pos = (x, y) self.text_func = text_func self.color = couleur self.font = pygame.font. SysFont (font_name, font_size) self.bounds = self.get_surface (text_func ()) def dessine (self, surface, centralized = False): text_surface, self.bounds = \ self.get_surface (self.text_func ()) si centralisé: pos = (self.pos [0] - self.bounds.width // 2, self.pos [1]) sinon: pos = self.pos surface.blit (text_surface, pos) def get_surface (self, text): text_surface = self.font.render (text, False, self.color) renvoie text_surface, text_surface.get_rect () def update (self): pass
Les jeux Pygame fonctionnent dans les fenêtres. Vous pouvez aussi les faire fonctionner en plein écran. Voici comment afficher une fenêtre Pygame vide. Vous pouvez déjà voir plusieurs des éléments dont j'ai parlé plus tôt. Tout d'abord, Pygame init ()
est appelé, puis la surface de dessin principale et l'horloge sont créés.
Vient ensuite la boucle principale, qui remplit constamment l'écran de gris uniforme et appelle l'horloge. cocher()
méthode avec le taux de trame.
importer pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) clock = pygame.time.Clock () tant que True: screen.fill ((192, 192, 192)) pygame.display.update clock.tick (60)
Habituellement, un fond de couleur uniforme n’est pas très excitant. Pygame fait très bien les images. Pour Breakout, j'ai fait des folies et suis allé chercher une image fantaisiste de l'espace réel de la NASA. Le code est très similaire. Tout d'abord, juste avant la boucle principale, il charge l'image d'arrière-plan à l'aide du pygame.image.load ()
une fonction. Ensuite, au lieu de remplir l’écran de couleur, il "blit" (copie les bits) l’image sur l’écran à la position (0,0). L'effet est que l'image est affichée sur l'écran.
importer pygame pygame.init () screen = pygame.display.set_mode ((800, 600)) clock = pygame.time.Clock () background_image = pygame.image.load ('images / background.jpg') tant que True: screen .blit (background_image, (0, 0)) pygame.display.update () clock.tick (60)
Pygame peut dessiner n'importe quoi. le pygame.draw
module a des fonctions pour dessiner les formes suivantes:
Dans Breakout, tous les objets (à l'exception du texte) ne sont que des formes. Regardons la méthode draw () des différents objets Breakout.
Les briques sont des briques. Ce ne sont que des rectangles. Pygame fournit le pygame.draw.rect ()
function, qui prend une surface, une couleur et un objet Rect (gauche, haut, largeur et hauteur) et rend un rectangle. Si le paramètre optionnel width est supérieur à zéro, le contour est tracé. Si la largeur est égale à zéro (valeur par défaut), un rectangle plein est dessiné..
Notez que le Brique
classe est une sous-classe de GameObject
et obtient toutes ses propriétés, mais il a aussi une couleur qu’il gère lui-même (car il peut y avoir des objets de jeu qui n’ont pas une seule couleur). Ignore le effets spéciaux
champ pour l'instant.
import pygame de game_object import Classe GameObject import Brick (GameObject): def __init __ (auto, x, y, w, h, couleur, special_effect = None): GameObject .__init __ (auto, x, y, w, h) self.color = color self.special_effect = special_effect def dessine (self, surface): pygame.draw.rect (surface, self.color, self.bounds)
La balle dans Breakout est juste un cercle. Pygame fournit le pygame.draw.circle ()
fonction prenant la couleur, le centre, le rayon et le paramètre de largeur des options dont la valeur par défaut est zéro. Comme avec le pygame.draw.rect ()
fonction, si la largeur est égale à zéro, un cercle solide est tracé. The Ball est également une classe dérivée de GameObject.
Comme la balle est toujours en mouvement (contrairement aux briques), elle a aussi une vitesse qui passe sur le GameObject
classe de base à gérer. La classe Ball a une petite torsion car ses paramètres x et y indiquent son centre, alors que les paramètres x et y sont passés à la GameObject
classe de base représente le coin supérieur gauche du cadre de sélection. Pour convertir du centre vers le coin supérieur gauche, il suffit de soustraire le rayon..
importer un fichier pygame depuis game_object. import GameObject class Ball (GameObject): def __init __ (self, x, y, r, couleur, vitesse): GameObject .__ init __ (self, x - r, y - r, r * 2, r * 2, vitesse) self.radius = r self.diameter = r * 2 self.color = couleur def dessiner (self, surface): pygame.draw.circle (surface, self.color, self.center, self.radius)
La palette est un autre rectangle qui se déplace effectivement de gauche à droite lorsque le joueur appuie sur les touches fléchées. Cela signifie que la position de la palette peut changer d'une image à l'autre, mais en ce qui concerne le dessin, il s'agit simplement d'un rectangle qui doit être restitué à la position actuelle, quelle qu'elle soit. Voici le code pertinent:
import pygame import config comme c depuis game_object import classe GameObject Paddle (GameObject): def __init __ (auto, x, y, w, h, couleur, offset): GameObject .__ init __ (auto, x, y, w, h) color = color self.offset = offset self.moving_left = False self.moving_right = False dessine (self, surface): pygame.draw.rect (surface, self.color, self.bounds)
Dans cette partie, vous avez appris comment utiliser la classe TextObject et comment restituer du texte à l'écran. Vous avez également appris à dessiner des objets comme les briques, la balle et la pagaie.
En attendant, rappelez-vous que nous avons une grande quantité de contenu Python disponible à la vente et à étudier sur le marché Envato..
Dans la troisième partie, vous verrez comment fonctionne la gestion des événements et comment Pygame vous permet d'intercepter et de réagir à des événements tels que l'appui sur les touches, les mouvements de la souris et les clics de souris. Ensuite, nous aborderons des sujets de jeu tels que le déplacement de la balle, le réglage de la vitesse de la balle et le déplacement de la raquette..