Jeu Space Invaders avec PyGame – Partie 3

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.

pygame tutoriel

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

Du lourd en perspective !

0

Laisser un commentaire