Projet 2 : Dodge the Creep

MéthodeLe background

Notre fond d'écran sera l'image water.png du dossier images qui a pour dimension 800x600 pixels (notre taille de fenêtre)

le code ci-dessous

1
import pgzrun
2
from pgzhelper import *
3
WIDTH = 800
4
HEIGHT = 600
5
6
background = Actor('water') # la variable background contient l'image 
7
8
def draw():
9
    background.draw() # on affiche le fond
10
11
pgzrun.go() # doit toujours être la dernière ligne

MéthodeLe player

  • On crée le player en début de programme

  • On crée une liste d'images pour simuler la marche

  • On définit la position initiale du player

1
# création du player
2
player = Actor('p1_front')
3
# création d'une liste d'images
4
player.images = ['p1_walk01', 'p1_walk02', 'p1_walk03', 'p1_walk04', 'p1_walk05', 'p1_walk06', 'p1_walk07', 'p1_walk08', 'p1_walk09', 'p1_walk10','p1_walk11']
5
# position du player
6
player.x = 400 
7
player.y = 300

On dessine le player dans la fonction draw()

1
def draw():
2
    background.draw() # on affiche le fond
3
    player.draw() # affichage du player

MéthodeDéplacement du player

On crée une fonction mouvement__player() qui gérera les déplacements du player

1
def mouvement_player():
2
    # mouvement du player avec les flèches du clavier
3
    if keyboard.up:
4
        player.y -= 5
5
        player.next_image()
6
    if keyboard.down:
7
        player.y += 5
8
        player.next_image()
9
    if keyboard.left:
10
        player.x -= 5
11
        player.next_image()
12
    if keyboard.right:
13
        player.x += 5
14
        player.next_image()

Et on met à jour cette fonction dans une fonction update()

1
def update():
2
    mouvement_player() # mise à jour du player

Pour empêcher que notre player ne sorte de la fenêtre on ajoute à la fonction mouvement_player() le code suivant :

1
		# pour empêcher le player de sortir de la fenêtre
2
    if player.x < player.width/2:
3
        player.x = player.width/2
4
    if  player.x > WIDTH - player.width/2:
5
        player.x = WIDTH - player.width/2
6
    if  player.y < player.height/2:
7
        player.y = player.height/2
8
    if  player.y > HEIGHT - player.height/2:
9
        player.y = HEIGHT - player.height/2

MéthodeEnnemis (partie 1)

Dans cette partie nous allons :

  • créer une liste vide pour contenir les ennemis

  • faire en sorte que les ennemis arrivent du côté droit de la fenêtre et le traverse vers la gauche

  • éliminer les ennemis lorsqu'ils traversent le côté gauche de la fenêtre

  • faire afficher les ennemis

Pour cela on crée la liste ennemis en début de programme et on crée deux fonctions create_enemy() et mouvement enemy() que l'on appellera dans la fonction update() et enfin on fera afficher les ennemis dans le fonction draw()

De plus on prendras le soins d'écrire en début de programme qu l'on importe la méthode randint du module random ( from random import randint )

1
# les ennemis
2
ennemis = []
3
4
def create_enemy():
5
    if randint(0,60) == 0: # une chance sur 61
6
        enemy = Actor('worm.png') # création de l'ennemi
7
        enemy.images = ['worm','worm_walk'] # une liste d'images pour le mouvement
8
        enemy.y = randint(0,600) # ordonnée aléatoire entre 0 et 600
9
        enemy.x = 850 # abscisse en dehors de la fenêtre à droite
10
        ennemis.append(enemy) # on l'ajoute à la liste
11
    
12
def mouvement_enemy():
13
    for enemy in ennemis: # pour chaque ennemi
14
        enemy.x = enemy.x - 3 # on décrémente son abscisse
15
        enemy.next_image() # changement d'image
16
		for enemy in ennemis:
17
        if enemy.x < -50: # s'il sort à gauche
18
            ennemis.remove(enemy) # on l'élimine de la liste

Dans les fonctions draw() et update() :

1
def update():
2
    mouvement_player() # mise à jour du player
3
    create_enemy() # on crée les ennemis
4
    mouvement_enemy() # on met à jour leur mouvement 
5
    
6
7
def draw():
8
    background.draw() # on affiche le fond
9
    player.draw() # affichage du player
10
    for enemy in ennemis: # on affiche les ennemis
11
        enemy.draw()

MéthodeEnnemis (partie 2)

Nos ennemis arrivent tous par la gauche...

Nous allons faire en sorte que certains arrivent par la gauche et d'autres par la droite.

Pour cela lors de la création de l'ennemi, on lui affectera un côté (side) qui vaut 1 si il doit arriver par la gauche et 2 si il doit arriver par la droite.

De plus avec pygame zero, on peut préciser l'angle de rotation de l'image (0 pour pas de rotation et 180 pour une rotation de 180° c.à.d : une symétrie de l'image)

Modifiez votre programme comme suit

1
def create_enemy():
2
    if randint(0,60) == 0:
3
        enemy = Actor('worm.png')
4
				enemy.images = ['worm','worm_walk']
5
        side = randint(1,2) # on choisit 1 ou 2
6
        if side == 1: # ceux-là arriveront par la gauche
7
            enemy.y = randint(0,600)
8
            enemy.x = 850
9
            enemy.angle = 0
10
        elif side == 2: # et ceux-là par la droite
11
            enemy.y = randint(0,600)
12
            enemy.x = -50
13
            enemy.angle = 180 # l'image sera inversée
14
        ennemis.append(enemy)
1
def mouvement_enemy():
2
    for enemy in ennemis:
3
        if enemy.angle == 0: # ceux qui arrivent par la gauche
4
            enemy.x = enemy.x - 3
5
            enemy.next_image()
6
        elif enemy.angle == 180: # ceux qui arrivent par la droite
7
            enemy.x = enemy.x + 3
8
            enemy.next_image()
9
    for enemy in ennemis:
10
        if enemy.x < -50 or enemy.x > 850: # ceux qui sortent de la fenêtre
11
            ennemis.remove(enemy)

MéthodeEnnemis (partie 3)

Faites en sorte que les ennemis arrivent également par le haut et le bas.

les angles à utiliser sont 270 pour le bas et 90 pour le haut.

side devra prendre 4 valeurs possibles (1 pour la gauche, 2 pour la droite  et 3 ou 4 pour le bas et haut)

Si vous avez réussi vous devriez voir cela 

Informations[1]

MéthodeLes collisions...

Dans ce jeu on perd si le joueur entre en collision avec un ennemi.

On crée donc une variable game_over initialisée à False, elle sera mise à True si une collision est détectée, sinon le jeu continue.

Pour les collisions, on dispose d'une méthode player.collidelist(ennemis) , qui renvoie l'indice de l'ennemi entré en collision avec le player et -1 sinon

Il faudra penser également à rajouter global game_over dans la fonction où cette variable sera modifiée, car il s'agit d'une variable globale

À faire :

  • créez le variable game_over initialisée à False

  • trouvez l'endroit approprié pour mettre le code suivant ( n'oubliez pas le global game_over)

1
if player.collidelist(ennemis) != -1:
2
        game_over = True

Modifier la fonction draw() comme suit

1
def draw():
2
    if game_over: # si elle est à True ( cette instruction est équivalente à if game_over == True)
3
        screen.clear() # on efface l'écran
4
        screen.draw.text('Game Over', (350,270), color=(255,255,255), fontsize=30) # on affiche Game Over
5
    else:
6
        background.draw()
7
        player.draw()
8
        for enemy in ennemis:
9
            enemy.draw()

MéthodeUn score...

Nous dirons que l'on gagne 1 point par seconde de survie...

En initialisant une variable globale score à 0 et comme la fonction update() s'exécute 60 fois par seconde, il suffira d'ajouter 1/60 à score dans cette fonction.

Réaliser ces changements... ne pas oublier global score...

Voilà les modifications à apporter à la fonction draw()

1
def draw():
2
    if game_over:
3
        screen.clear()
4
        screen.draw.text('Game Over', (350,270), color=(255,255,255), fontsize=30)
5
        screen.draw.text('Score: ' + str(round(score)), (350,330), color=(255,255,255), fontsize=30)
6
    else:
7
        background.draw()
8
        player.draw()
9
        for enemy in ennemis:
10
            enemy.draw()
11
    screen.draw.text('Score: ' + str(round(score)), (15,10), color=(255,255,255), fontsize=30)

ComplémentAméliorations...

  • Comme vous l'aurez constaté le score continue d'augmenter après un game over, corrigez cela.

  • On peut ajouter une musique pour le jeu , le dossier sounds contient des sons et musique.

    • Pour une musique d'ambiance, écrire le code suivant en dehors des fonctions sounds.sneakingaround.play(-1)

  • Le code ci-dessous permet de faire jouer un son lors du déplacement du joueur

1
def mouvement_player():
2
    # mouvement du player avec les flèches du clavier
3
    play_walking_sound = False # initialisation
4
    if keyboard.up:
5
        player.y -= 5
6
        play_walking_sound = True
7
    if keyboard.down:
8
        player.y += 5
9
        play_walking_sound = True
10
    if keyboard.left:
11
        player.x -= 5
12
        play_walking_sound = True
13
    if keyboard.right:
14
        player.x += 5
15
        play_walking_sound = True
16
    #### on joue un sons lors du déplacement du joueur
17
    if play_walking_sound:
18
        if sounds.footsteps.get_num_channels() == 0:
19
            sounds.footsteps.play()

On peut aussi ...

  • Augmenter le nombre d'ennemis en fonction du temps qui passe..

  • faire en sorte que les ennemis aient des vitesse différente..

  • Faire arrêter la musique ou en jouer une autre sur l'écran de game over.. ;

  • ...