Construire des jeux avec Python 3 et Pygame Partie 2

Vue d'ensemble

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.. 

La classe TextObject

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

Création de la fenêtre principale

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)

Utiliser une image de fond

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)

Dessiner des formes

Pygame peut dessiner n'importe quoi. le pygame.draw module a des fonctions pour dessiner les formes suivantes:

  • rect 
  • polygone
  • cercle
  • ellipse
  • arc
  • ligne
  • lignes
  • ligne anti-aliasée 
  • lignes anti-aliasées

Dans Breakout, tous les objets (à l'exception du texte) ne sont que des formes. Regardons la méthode draw () des différents objets Breakout.

Dessin briques

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)

Tirer la balle

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)

Tirer la pagaie

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)

Conclusion

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..