Dans la seconde partie, nous avons réaliser le menu de notre jeu Space Invaders avec Pygame. Cliquez pour voir la seconde partie du tutoriel.
Aujourd’hui, nous créerons la première brique de la vue Jeu.
Initialisation de Pygame
Tout d’abord, initialisons Pygame pour nous aider à créer l’écran Jeu.
#!/usr/bin/python3 import sys import pygame pygame.init()
Création des Modèles
Afin de faciliter la gestion des objets dans notre jeu ( navette spatiale, ennemis, etc), nous souhaitons définir des modèles de données ( classes ).
Pour éviter les répétitions dans le code source, nous créons un modèle de base appelé GameObject qui sera réutilisé dans nos modèles.
# classes/gameobject.py import pygame class GameObject: def __init__(self, image): # Init image self.image = pygame.image.load(image) self.sprite = self.image.get_rect() def init_pos(self, pos): # Init position self.sprite.x, self.sprite.y = pos
Ci desssous, La méthode super référence le modèle de base GameObject.
Nous définirons la position des objets Life dynamiquement dans la boucle de jeu.
Chaque vie sera représentée à l’écran par l’image spaceship_mini.
# classes/life.py from classes.gameobject import GameObject class Life(GameObject): def __init__(self, pos): super(Life, self).__init__("./resources/images/spaceship_mini.png") self.init_pos(pos)
Pour créer, le modèle Invader et Bullet la même logique est utilisée.
# classes/invader.py from classes.gameobject import GameObject class Invader(GameObject): def __init__(self, pos): super(Invader, self).__init__("./resources/images/invader.png") self.init_pos(pos) # classes/bullet.py from classes.gameobject import GameObject class Bullet(GameObject): def __init__(self, pos): super(Bullet, self).__init__("./resources/images/bullet.png") self.init_pos(pos)
Dans le jeu, un seul objet Spaceship sera présent, la navette sera placée par défaut en bas au centre.
# classes/spaceship.py from classes.gameobject import GameObject class Spaceship(GameObject): def __init__(self, size): super(Spaceship, self).__init__("./resources/images/spaceship.png") pos = ( # width screen_size[0] / 2 - self.sprite.width / 2, # height screen_size[1] - self.sprite.height ) self.init_pos(pos) self.exploding = False self.shoot = False self.shooting = False
Initialisation de l’écran Jeu
Cette partie se décompose en sous objectif.
- Initialisation du Jeu
- Positionnement des éléments visuels
Paramétrage des variables de jeu
Premièrement, nous définissons la classe pour gérer le jeu avec les paramètres suivants.
class Game: def __init__(self, screen): self.clock = pygame.time.Clock()
A présent, nous paramétrons la hauteur et largeur de l’écran à partir de la variable screen.
# init self.screen = screen self.scr_width = self.screen.get_rect().width self.scr_height = self.screen.get_rect().height self.size = self.scr_width, self.scr_height
Ensuite, ajoutons un fond d’écran et des effets sonores pour mettre dans l’ambiance.
# Background Game self.bg = pygame.image.load("resources/images/starsbackground.jpg") self.bg_rect = self.bg.get_rect() # Sound Game self.laser_sound = pygame.mixer.Sound('resources/sounds/laser_shot.wav') self.laser_sound.set_volume(0.2)
Quand le joueur gagne ou perd, un message doit s’afficher.
# Labels self.font = pygame.font.SysFont(None, 100) self.label_game_over = self.font.render("Game Over", 1, (255, 255, 255)) self.label_victory = self.font.render("Victory is yours", 1, (255, 255, 255))
Par défaut, le joueur a 3 vies et 10 envahisseurs sont créés.
# Life Bar self.lifes = [] self.lifes_number = 3 # Invaders self.invaders = [] self.invaders_number = 10
On initialise des variables de jeu pour gérer le retour au menu, les écrans gameover et victory.
# game.__init__ self.game_over = False self.victory = False self.escape_selected = False
A présent, créons des séquences pour contenir un invader aléatoire et son projectile.
# Objects initialisation self.randinvader = () self.ennemybullet = ()
Les paramètres suivants permettent de gérer les mouvement et tirs des invaders.
self.has_already_chosen = False # Go down every second self.nasty_move_time = 1000 # Invader shoot duration self.nasty_shoot_time = 1000 self.invaders_moving = False self.invader_exploding = False # Timer for invaders vertical moving self.timecount_m = 0 # Time for invader bullet vertical moving self.timecount = 0
Positionnement des éléments
Nous initialisons les positions par défaut du vaisseau, des envahisseurs et des vies sur l’écran.
# Spaceship position self.spaceship = Spaceship(self.size) self.init_pos_bullet = ( self.spaceship.sprite.x + self.spaceship.sprite.width / 2, self.spaceship.sprite.y) self.bullet = Bullet(self.init_pos_bullet) # Init Invaders self.init_x = 10 for i in range(self.invaders_number): self.invaders.append(Invader((self.init_x, 10))) self.init_x += 50 # Init life bar self.init_life_x = self.scr_width - 120 for i in range(self.lifes_number): self.lifes.append(Life((self.init_life_x, 0))) self.init_life_x += 40
Le tutoriel s’achève pour aujourd’hui. Dans le dernier tuto, nous ajouterons la plus grosse partie qui est la boucle de jeu .
La dernière partie contiendra les éléments suivants, Cliquez pour y accéder
- Traitement des évènements clavier et souris
- Gestion du mouvement
- Gestion des collisions