Encore des ameliorations pour mon programme en pygame où ce sont les couleurs
bleues et rouges de
Tuxpaint qui mènent le jeu. :cool:
Il faudra bien sûr changer le chemin vers vos images dans:
# indique le chemin des images
chemin = '/home/user/programmation/04_programmes_maternelles/'
Une nouvelle image a été ajoutée: "arriereplan_cote.png", simple image blanche, qui mesure 192 * 472 px. Elle sera placée à droite du jeu, et servira de fond pour la partie "score".
arriereplan1.png, arriereplan2.png (comportant les couleurs
bleues et rouges définies dans le jeu), tux_victoire.png et tux_defaite.png font toutes 608 * 472 px, comme dans
Tuxpaint et ne comportent pas de transparence. Voir
les images du programme Miks
La taille de l'écran étant définie par ailleurs dans le code, il faut mieux ne pas changer la taille de ces images.
Les 3 poses du nounours Miks sont les même que lors des essais précédents (ils font environ 50 px de haut, mais leur taille exacte n'a pas d'importance pour le jeu). Bien sûr, vous pouvez remplacer tout ça par votre propres images (faites avec
Tuxpaint +
Gimp ou
Inkscape) et les placer dans le même dossier que le jeu !
"arriereplan.png" peut cette fois être une simple image blanche de 608 * 472 px. J'aurais aimé la supprimer (mais je ne peux pas sans revoir beaucoup mon code donc je la laisse) car les chiffres 1 et 2 sont maintenant affichés avec cette fonction.
def imprime_texte(texte,x_texte):
""" affiche du texte à l'écran avec la police et la couleur choisie """
ma_police = pygame.font.SysFont("arial", 100)
surface_texte = ma_police.render(texte, True, vert)
screen.blit(surface_texte, (x_texte, height+(height/2)))
La position verticale est définie par une hauteur qui se trouve ailleurs dans le code (cherchez un peu !). On appellera ensuite dans la boucle cette fonction imprime_texte. La position horizontale est alors indiquée par une largeur définie également ailleurs dans le code (cherchez encore !). Cela correspond au
x_texte de la fonction (est-ce clair ?)
# affiche les chiffres 1 puis 2 grâce à la fonction d'affichage de texte
imprime_texte("1", width-(width/2))
imprime_texte("2", width+(width/2))
Ce nouveau code permet d'afficher le score d'une manière plus visuelle pour les petits, avec des petits nounours qui apparaissent quand le score augmente.
Voir dans le code le détail de la fonction sous la ligne suivante:
def verifie_score():
J'ai volontairement limité le score affiché à 6 car c'est à peu près ce que les enfants apprennent en moyenne section de maternelles, mon public cible... 😉
Voici le code entier du jeu au stade où il en est maintenant:
#!/usr/bin/ env python
# -*- coding: utf-8 -*-
# importe la bibliothèque Pygame
import pygame
from pygame.locals import *
from sys import exit
import os.path
# indique le chemin des images
chemin = '/home/user/programmation/04_programmes_maternelles/'
# définit les images choisies pour l'arrière-plan et la souris sans le chemin de leur dossier
nom_image_arriereplan = 'arriereplan.png'
nom_image_arriereplan_cote = 'arriereplan_cote.png'
nom_image_arriereplan1 = 'arriereplan1.png'
nom_image_arriereplan2 = 'arriereplan2.png'
nom_image_victoire = 'tux_victoire.png'
nom_image_defaite = 'tux_defaite.png'
nom_image_souris1 = 'miks_static.png'
nom_image_souris2 = 'miks_smackup2.png'
nom_image_souris3 = 'miks_roll2.png'
# définit les images choisies pour l'arrière-plan et la souris avec le chemin du dossier
image_arriereplan = chemin + nom_image_arriereplan
image_arriereplan_cote = chemin + nom_image_arriereplan_cote
image_arriereplan1 = chemin + nom_image_arriereplan1
image_arriereplan2 = chemin + nom_image_arriereplan2
image_victoire = chemin + nom_image_victoire
image_defaite = chemin + nom_image_defaite
image_souris1 = chemin + nom_image_souris1
image_souris2 = chemin + nom_image_souris2
image_souris3 = chemin + nom_image_souris3
# appelle la fonction horloge et le temps
clock = pygame.time.Clock()
temps = pygame.time.get_ticks()
temps2 = clock.get_time()
#initialise pygame
pygame.init()
# initialise les variables
i = 0
k = 0
score = 0
# définit la taille de la fenêtre
screen = pygame.display.set_mode((800, 472), 0, 32)
# donne le titre de la fenêtre
pygame.display.set_caption("Miks aime le bleu")
# charge les images
arriereplan = pygame.image.load(image_arriereplan).convert()
arriereplan_cote = pygame.image.load(image_arriereplan_cote).convert()
arriereplan1 = pygame.image.load(image_arriereplan1).convert()
arriereplan2 = pygame.image.load(image_arriereplan2).convert()
victoire = pygame.image.load(image_victoire).convert()
defaite = pygame.image.load(image_defaite).convert()
souris1 = pygame.image.load(image_souris1).convert_alpha()
souris2 = pygame.image.load(image_souris2).convert_alpha()
souris3 = pygame.image.load(image_souris3).convert_alpha()
# récupère la largeur et la hauteur de l'image d'arrière-plan
largeur_arriereplan = arriereplan.get_width()
hauteur_arriereplan = arriereplan.get_height()
# divise et réduit la largeur et la hauteur d'arrière-plan
width = largeur_arriereplan/2-18
height = hauteur_arriereplan/2-12
# crée les vignettes de la page accueil
arriereplan1p = pygame.transform.scale(arriereplan1, (width, height))
arriereplan2p = pygame.transform.scale(arriereplan2, (width, height))
# définit les couleurs
bleu = (50, 100, 255, 255)
rouge = (255, 0, 0, 255)
vert = (0, 255, 0)
# indique les scores maximums et minimums
score_max = 3000
score_min = -3000
# fonction d'affichage de la souris suivant la couleur de l'arrière-plan
def rendu_miks():
""" k est la position dans le tableau initialisée à 0 """
k = 0
""" si la couleur est bleue, change k et donc l'image de la souris """
if couleur_ecran == bleu:
k = 1
""" si la couleur est rouge, change k et donc l'image de la souris """
elif couleur_ecran == rouge:
k = 2
""" affiche l'image de la souris """
screen.blit(souris_x[k], (x,y))
def imprime_texte(texte,x_texte):
""" affiche du texte à l'écran avec la police et la couleur choisie """
ma_police = pygame.font.SysFont("arial", 100)
surface_texte = ma_police.render(texte, True, vert)
screen.blit(surface_texte, (x_texte, height+(height/2)))
def accueil_jeu():
""" Définit les dimensions du rectangle de la page d'accueil """
Rect = (6, 16, largeur_arriereplan-12, height+12)
i = 0
""" remplit l'écran de blanc """
screen.fill((255,255,255))
""" crée un rectangle vert """
pygame.draw.rect(screen, vert, Rect, 0)
""" affiche successivement la première vignette et la deuxième sur la page d'accueil """
screen.blit(arriereplan1p, (10, 20))
screen.blit(arriereplan2p, ((width+24), 20))
""" affiche l'image de la souris """
k = 0
screen.blit(souris_x[k], (x,y))
def verifie_score():
""" affiche le score réel puis le temps dans la console """
print score
print temps
""" affiche le nombre de nounours correspondant au score affiché """
if score2 == 0:
screen.blit(souris_x[0], ((largeur_arriereplan+30), 20))
if score2 < 0:
for s in range(0,3):
if score2 < -s:
screen.blit(souris_x[2], ((largeur_arriereplan+30), (20+s*80)))
for s in range(0,3):
if score2 < -(s+3):
screen.blit(souris_x[2], ((largeur_arriereplan+130), (20+s*80)))
if score2 > 0:
for s in range(0,3):
if score2 > s:
screen.blit(souris_x[1], ((largeur_arriereplan+30), (20+s*80)))
for s in range(0,3):
if score2 > (s+3):
screen.blit(souris_x[1], ((largeur_arriereplan+130), (20+s*80)))
while True:
# pour fermer la fenêtre
for event in pygame.event.get():
if event.type == QUIT:
exit()
# inscrémente le temps depuis le début du jeu
temps += 1
# récupère les touches pressées
touche_pressee = pygame.key.get_pressed()
#tableau des images pour l'arrière-plan
arriereplan_x = [arriereplan, arriereplan1, arriereplan2]
screen.blit(arriereplan_cote, (608, 0))
# choisit l'image d'arrière-plan selon la touche
if touche_pressee[K_KP1]:
i = 1
elif touche_pressee[K_KP2]:
i = 2
elif touche_pressee[K_KP0]:
i = 0
# affiche l'arrière-plan en fonction de la touche pressée, connue grâce à la variable i
screen.blit(arriereplan_x[i], (0, 0))
# définit la position de la souris
x, y = pygame.mouse.get_pos()
# échantillonne la couleur que survole la souris
couleur_ecran = screen.get_at((x, y))
# tableau des images utilisées pour la souris
souris_x = [souris1, souris2, souris3]
# Place le curseur de la souris au centre de l'image
x-= souris_x[k].get_width() / 2
y-= souris_x[k].get_height() / 2
# Si on presse la touche 0
if i == 0:
# appelle la fonction qui affiche la page d'accueil
accueil_jeu()
# affiche les chiffres 1 puis 2 grâce à la fonction d'affichage de texte
imprime_texte("1", width-(width/2))
imprime_texte("2", width+(width/2))
# si la touche 1 ou la touche 2 sont pressés
elif i == 1 or i == 2:
# divise le score par 500 pour des chiffres plus petits et un changement moins rapide
score2 = score/500
# si la couleur est bleue, on ajoute 1 au score
if couleur_ecran == bleu and score2 < 6:
score +=1
# si la couleur est rouge, on ote 1 au score
if couleur_ecran == rouge and score2 > -6:
score -=1
# appelle la fonction d'affichage l'image de la souris
rendu_miks()
# transforme le chiffre du petit score en texte à afficher
texte_score = str(score2)
# affiche le petit score sur l'écran grâce à la fonction d'affichage de texte
imprime_texte(texte_score,(largeur_arriereplan + 40))
# appelle la fonction de vérification du score
verifie_score()
# si le score dépasse le maximum, affiche l'image de la victoire
if score2 >= 6:
screen.blit(victoire, (0, 0))
# si le score est inférieur au minimum, affiche l'image de la défaite
if score2 <= -6:
screen.blit(defaite, (0, 0))
# réactualise l'affichage
pygame.display.flip()
Mon souci reste que le score ne se "bloque" pas à 6: si on bouge la souris quand l'image de la défaite ou de la victoire s'affiche, on peut revenir sur le jeu involontairement. :/
Continue ou
break ne fonctionne pas comme je le voudrais. Break arrête le jeu et la fenêtre se ferme et si je me souviens bien, continue ne change rien au problème.
L'idéal serait de pouvoir revenir automatiquement à la page d'accueil après un petit temps de latence, je pense.