Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#76 Le 16/05/2011, à 19:01

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

miks_static.png   miks_smackup2.png    miks_roll2.png   miks_walk2.png  Attention, dans l'album, il y a les même nounours plus grands. ici, ce sont les petits qu'on utilise.
Mon jeu avec les couleurs devient assez complet. J'ai essayé d'utiliser pygame.time.wait(temps en ms) pour finir le jeu, sans succès. J'ai donc rusé énormément, ce qui n'est peut-être pas orthodoxe mais ça marche !
J'ai créé encore une nouvelle image, arriereplan_cote2.png (de même taille que arriereplan_cote.png, qui elle est entièrement blanche)  et j'ai fait 2 nouveaux arrière plans mieux conçus, avec un carré jaune comme destination finale. Le jaune provoque l'affichage de la victoire si on a obtenu 6 points en passant dans le bleu.
couleurs du programmeVous trouverez ces nouveautés dans mon album web. Vérifiez que les noms correspondent bien à ceux du programme ci-dessous au cas où j'aurais fait une erreur ! wink
Pensez aussi à changer le chemin avec celui de votre dossier à vous.

#!/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/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_arriereplan_cote2 = 'arriereplan_cote2.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'
nom_image_souris1b = 'miks_walk2.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_arriereplan_cote2 = chemin + nom_image_arriereplan_cote2
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
image_souris1b = chemin + nom_image_souris1b

# 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()
arriereplan_cote2 = pygame.image.load(image_arriereplan_cote2).convert_alpha()
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()
souris1b = pygame.image.load(image_souris1b).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)
jaune = (255, 255, 0)
blanc = (255, 255, 255)
orange = (255, 128, 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():  
    """ si la couleur est bleue, change k et donc l'image de la souris """
    if couleur_ecran != bleu and couleur_ecran != rouge:
        if temps%2 == 0:   
            k = 0
            pygame.time.wait(100)
        else:
            k = 3
            pygame.time.wait(100)  
    if couleur_ecran == bleu: 
        if temps%2 == 0:     
            k = 0
            pygame.time.wait(100)            
        else:
            k = 1
            pygame.time.wait(200)       
    elif couleur_ecran == rouge:
        if temps%2 == 0:       
            k = 0
            pygame.time.wait(100)            
        else:
            k = 2
            pygame.time.wait(200)
    """ 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, souris1b] 

    # 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 à al 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/10
        # 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()

        # appelle la fonction de vérification du score
        verifie_score()  
        
        # 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
        if score2 >= -6 and score2 <=6:
            imprime_texte(texte_score,(largeur_arriereplan + 40))        

        # si le score dépasse le maximum et que la partie jaune est atteinte, affiche l'image de la victoire
        if score2 >= 6 and couleur_ecran == jaune:
            screen.blit(victoire, (0, 0))
            screen.blit(arriereplan_cote2, (608, 0))
            score += 3000
            
        if score > 3000:
            screen.blit(victoire, (0, 0))
            screen.blit(arriereplan_cote2, (608, 0))        
                
        # si le score est inférieur au minimum, affiche l'image de la défaite
        if score2 <= -6:
            score -=10000
            screen.blit(defaite, (0, 0)) 
            screen.blit(arriereplan_cote2, (608, 0)) 
              
    # réactualise l'affichage
    pygame.display.flip()

La ruse que j'ai trouvée, c'est d'augmenter ou de réduire drastiquement la variable score pour que le jeu s'interrompe suffisamment longtemps après l'affichage de tux_victoire.png (appelé à la fois par un score supérieur à 6 et par la couleur jaune) et de tux_defaite.png (appelé par un score inférieur à -6)
Ça ne me permet pas de revenir à l'accueil, je n'y suis pas parvenue avec pygame.time.wait qui bloquait un moment le nounours sur le jaune avant d'afficher l'image de la victoire et non après comme je m'y attendais.

A noter qu'il est indispensable que seul le lieu d'arrivée contienne du jaune dans les images d'arrière-plan.

Dernière modification par doudoulolita (Le 16/05/2011, à 19:25)

Hors ligne

#77 Le 16/05/2011, à 20:44

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Le code ci-dessus a été réalisé sous Linux. J'ai réussi à ouvrir le programme également sous Windows7 en changeant bien sûr le chemin. La ruse est que les \ doivent être remplacés par des / dans le chemin du fichier, et il ne faut pas oublier le dernier / à la fin du chemin.

Exemple :

C:/Users/nom_user/Documents/programmation/programmes_maternelles/

Ca c'est pas trop simple à faire pour des gamins de maternelles mais ils ont bien des parents, non ? lol

Dans les propriétés de mon fichier, j'ai bien précisé qu'il devait s'ouvrir avec python, comme ça un double-clic suffit pour l'ouvrir.
J'ai ensuite créé un raccourci sur le bureau. J'ai créé une icône au format carré pour mon raccourci avec Gimp (enregistrement en .ico) C'est super !
Manquerait plus que j'arrive à créer un .exe ne nécessitant pas l'installation préalable de python et pygame et ça ferait un petit jeu rigolo à proposer sur mon site nounours.

Evidemment, il serait très intéressant de pouvoir charger un fichier de Tuxpaint sans avoir à le renommer et en tout cas de ne pas avoir besoin de changer le chemin du dossier, mais je n'en suis pas encore là.

Je pense par contre déjà à concocter une version avec plus d'arrière-plans et peut-être un truc où les éléments rouges bougeraient aléatoirement ou selon un chemin déterminé. cool

En tout cas, j'ai réussi un vrai jeu avec un objectif à atteindre pour gagner. Même s'il est très simple et pas forcément codé très correctement, je suis assez fière de moi ! big_smile

Dernière modification par doudoulolita (Le 16/05/2011, à 20:48)

Hors ligne

#78 Le 16/05/2011, à 21:21

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

bravo smile

(bon, le code, je t'avoue que j'ai pas le courage de tout passer en revue pour te dire comment il aurait fallu faire wink mais après tout, c'est le résultat qui compte smile)

sinon, pour créer un installeur pour ton jeu, tu peux t'inspirer de la procédure que j'ai pour faire une release d'usf pour windows… http://usf.tuxfamily.org/wiki/Make_a_release#Windows

Dernière modification par tshirtman (Le 16/05/2011, à 21:22)

Hors ligne

#79 Le 16/05/2011, à 23:36

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Encore une amélioration: le répertoire du jeu doit contenir un sous-dossier data. On y place les images d'arrière-plan venant de Tuxpaint sans les renommer (penser à faire un raccourci vers le répertoire de sauvegarde des images de Tuxpaint, les enfants ou les parents n'auront qu'à les glisser d'un dossier à l'autre) .
note: Il faut auparavant supprimer du dossier global les images arriereplan1.png et arriereplan2.png utilisées dans le code précédent ou tout bêtement les déplacer dans le dossier data.

Ce code permet de récupérer le nom des images, quel qu'il soit  contenues dans le dossier data (minimum 2 images sinon je ne garantis rien !). Je l'ai d'abord testé dans un fichier à part, je souhaitais faire un 'import' mais ça n'a pas marché. Il faut sans doute veiller à ce que les noms de fichier ne comportent pas d'espace, mais dans Tuxpaint, il n'y en a pas.

data_file = 'data/'

print data_file

currentPath = chemin+data_file
dirFiles = os.listdir(currentPath) 
numFiles = len(dirFiles)
    
print numFiles
print dirFiles[0]
print dirFiles[1]

# nom des images contenues dans le dossier data
image1 = dirFiles[0]
image2 = dirFiles[1]

print image1
print image2

Il suffit d'indiquer au programme que ce sont ces images là qu'on veut comme arriere-plan grâce à:

nom_image_arriereplan1 = image1
nom_image_arriereplan2 = image2

On pense aussi à indiquer qu'elles sont dans le dossier data:

image_arriereplan1 = chemin + data_file + nom_image_arriereplan1
image_arriereplan2 = chemin + data_file + nom_image_arriereplan2

Ce qui donne au total (ne pas oublier de changer le chemin du dossier global):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# importe la bibliothèque Pygame
import pygame
from pygame.locals import *
import os
import sys

# indique le chemin du dossier
chemin = 'C:/Users/nom_user/Documents/programmation/04c_programmes_maternelles/'

# chemin des images personnelles
data_file = 'data/'

print data_file

currentPath = chemin+data_file
dirFiles = os.listdir(currentPath) 
numFiles = len(dirFiles)
    
print numFiles
print dirFiles[0]
print dirFiles[1]

# nom des images contenues dans le dossier data
image1 = dirFiles[0]
image2 = dirFiles[1]

print image1
print image2

# 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_arriereplan_cote2 = 'arriereplan_cote2.png'
nom_image_arriereplan1 = image1
nom_image_arriereplan2 = image2
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'
nom_image_souris1b = 'miks_walk2.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_arriereplan_cote2 = chemin + nom_image_arriereplan_cote2
image_arriereplan1 = chemin + data_file + nom_image_arriereplan1
image_arriereplan2 = chemin + data_file + 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
image_souris1b = chemin + nom_image_souris1b

# 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()
arriereplan_cote2 = pygame.image.load(image_arriereplan_cote2).convert_alpha()
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()
souris1b = pygame.image.load(image_souris1b).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)
jaune = (255, 255, 0)
blanc = (255, 255, 255)
orange = (255, 128, 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():  
    """ si la couleur est bleue, change k et donc l'image de la souris """
    if couleur_ecran != bleu and couleur_ecran != rouge:
        if temps%2 == 0:   
            k = 0
            pygame.time.wait(100)
        else:
            k = 3
            pygame.time.wait(100)  
    if couleur_ecran == bleu: 
        if temps%2 == 0:     
            k = 0
            pygame.time.wait(100)            
        else:
            k = 1
            pygame.time.wait(200)       
    elif couleur_ecran == rouge:
        if temps%2 == 0:       
            k = 0
            pygame.time.wait(100)            
        else:
            k = 2
            pygame.time.wait(200)
    """ 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, souris1b] 

    # 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 à al 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/10
        # 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()

        # appelle la fonction de vérification du score
        verifie_score()  
        
        # 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
        if score2 >= -6 and score2 <=6:
            imprime_texte(texte_score,(largeur_arriereplan + 40))        

        # si le score dépasse le maximum et que la partie jaune est atteinte, affiche l'image de la victoire
        if score2 >= 6 and couleur_ecran == jaune:
            screen.blit(victoire, (0, 0))
            screen.blit(arriereplan_cote2, (608, 0))
            score += 3000
            
        if score > 3000:
            screen.blit(victoire, (0, 0))
            screen.blit(arriereplan_cote2, (608, 0))        
                
        # si le score est inférieur au minimum, affiche l'image de la défaite
        if score2 <= -6:
            score -=10000
            screen.blit(defaite, (0, 0)) 
            screen.blit(arriereplan_cote2, (608, 0)) 
              
    # réactualise l'affichage
    pygame.display.flip()

De mieux en mieux, non ? cool

Dernière modification par doudoulolita (Le 23/05/2011, à 11:08)

Hors ligne

#80 Le 17/05/2011, à 10:14

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Essai du programme sur Linux (Ubuntu 10.04):
En partant de la console, le jeu se lance correctement. Pour le raccourci sur le bureau par contre, il ne se passe rien quand je double clique dessus. Voici ce que j'obtiens en contrôlant via la console:

epn13@epn13-desktop:~$ Bureau/miks_tuxpaint.desktop 
Bureau/miks_tuxpaint.desktop: line 2: [Desktop : commande introuvable
Bureau/miks_tuxpaint.desktop: /home/epn13/01-laurence/programmation/04c_programmes_maternelles/13c_miks_tuxpaint.py : /usr/bin/ : mauvais interpréteur: Permission non accordée

Pourtant, j'ai bien rendu le fichier exécutable.
Mes programmes précédents ne posaient pas ce type de problème quand j'utilisais un lanceur sur le Bureau.

Dernière modification par doudoulolita (Le 17/05/2011, à 10:15)

Hors ligne

#81 Le 17/05/2011, à 10:29

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

hum, non un fichier .desktop ne se lance pas comme ça en commande, il faut lancer la commande qui est dedans, (la ligne "exec")

edit, il est possible que la première ligne de ton script ne soit pas correcte:

#!/usr/bin/env python

pour un script python

#!/usr/bin/env sh

pour un script shell.

Dernière modification par tshirtman (Le 17/05/2011, à 10:30)

Hors ligne

#82 Le 23/05/2011, à 10:36

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Cette correction ne donnait rien mais j'ai trouvé le problème et sa solution:

currentPath = chemin+data_file

En fait, le chemin des images du dossier data n'était pas accessible puisque c'était le chemin relatif et non le chemin absolu.
J'ai fait la correction dans le post où j'ai mis tout le programme.

Ce qui pose encore problème avant de faire un .deb ou un .exe, c'est tout de même ce chemin, qu'on doit changer en fonction de son ordi, et ça c'est pas cool pour des débutants.

J'ai trouvé ces pages mais je n'y comprends goutte: en anglais http://docs.python.org/library/os.path.html et en français: http://diveintopython.adrahon.org/funct … _path.html

A mon avis, tout se passe ici mais il va falloir que je teste plus avant pour bien piger.

import os
>>> os.getcwd()
/home/you
>>> os.path.abspath('')
/home/you

Hors ligne

#83 Le 23/05/2011, à 11:05

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

En fait, le même problème qu'avant se pose. Quand j'utilise ça, cela marche dans la console:

chemin = os.getcwd() + '/' 

ou

chemin = os.path.abspath('')+'/'

Par contre, je n'arrive pas à lancer avec le lanceur sur le bureau (sous ubuntu)

Dernière modification par doudoulolita (Le 23/05/2011, à 11:09)

Hors ligne

#84 Le 23/05/2011, à 11:07

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

La solution semble de chercher d'abord le chemin du fichier, puis d'en ôter le nom du fichier pour obtenir le chemin du répertoire. Ici, le test est fait sous Linux.

# indique le chemin du dossier
chemin = '/home/user/programmation/04c_programmes_maternelles/'

est remplacé par

# indique le chemin du dossier
chemin_fichier = sys.argv[0]
chemin1 = os.path.abspath(chemin_fichier)
chemin = os.path.dirname(chemin1) + '/'
print chemin

Je rappelle que je me suis inspirée de http://diveintopython.adrahon.org/funct … _path.html pour trouver ça. Il faut rendre à César ce qui est à César ! wink

Dernière modification par doudoulolita (Le 23/05/2011, à 11:15)

Hors ligne

#85 Le 23/05/2011, à 11:15

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

J'ai eu des soucis de ce genre dans USF aussi, d'où la création d'un fichier de config, la détection de si on est une version installée ou non du jeu, et pas mal d'autres détails, c'est un vrai problême... après quand tu package, tu maitrises ou vont être les données (/usr/share/games/ton_jeu la plupart du temps) et donc tu peut gérer ça en dur, mais construire quelque chose qui marche dans plusieurs situations est assez problématique.

Donc il est normal que tu butte sur ce problème wink

Hors ligne

#86 Le 26/05/2011, à 14:04

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Pour la création de setup.py et pour faire une archive de mon jeu pour Linux, j'essaie ce qui est marqué là: http://docs.python.org/distutils/introd … le-example
Ca paraît plus simple que l'autre qui est en lien sur la page.

Hors ligne

#87 Le 26/05/2011, à 14:26

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Pour simplifier, J'ai changé le nom de mon jeu en miks_game (pour le dossier comme pour miks_game.py)

Voici le contenu de setup.py que j'ai créé dans le dossier du jeu:

#!/usr/bin/env python

from distutils.core import setup
setup(name='miks_game',
      version='1.0',
      py_modules=['miks_game'],
      )

Après, je suis la procédure:

python setup.py sdist

cela me donne:

epn13@epn13-desktop:~/01-laurence/programmation/miks_game$ python setup.py sdistrunning sdist
warning: sdist: missing required meta-data: url
warning: sdist: missing meta-data: either (author and author_email) or (maintainer and maintainer_email) must be supplied
warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
warning: sdist: standard file not found: should have one of README, README.txt
writing manifest file 'MANIFEST'
creating miks_game-1.0
making hard links in miks_game-1.0...
hard linking miks_game.py -> miks_game-1.0
hard linking setup.py -> miks_game-1.0
creating dist
tar -cf dist/miks_game-1.0.tar miks_game-1.0
gzip -f9 dist/miks_game-1.0.tar
removing 'miks_game-1.0' (and everything under it)

J'obtiens bien l'archive miks_game-1.0.tar.gz, elle est contenue dans un répertoire dist.

Je place l'archive sur le bureau et je la décompresse. Je me mets dans la peau d'un usager qui veut installer le jeu.

python setup.py install

Je n'ai pas eu le temps de copier ce que me donne la console mais ça a l'air de fonctionner. J'ai un répertoire build qui s'est installé dans le répertoire du jeu.
Le problème, c'est que je ne parviens pas à faire démarrer le jeu avec ça ! Si je double-clic sur setup.py ou sur miks_game.py, ça les ouvre dans gedit.

Peut-être aurais-je dû utiliser l'autre méthode plus complexe... sad

Dernière modification par doudoulolita (Le 26/05/2011, à 15:05)

Hors ligne

#88 Le 26/05/2011, à 14:35

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Ensuite, j'ai essayé de faire un .deb avec ta méthode mais ça ne marche pas: sad

root@epn13-desktop:~/Bureau/miks_game-1.0# python setup.py --command-packages=stdeb.command bdist_deb
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: setup.py --help [cmd1 cmd2 ...]
   or: setup.py --help-commands
   or: setup.py cmd --help

error: invalid command 'bdist_deb'

J'ai tout recommencé et avant de faire ta commande, j'ai installé python-distutils-extra, python-setuptools et python-stdeb.
je ne sais pas lequel a marché mais ça s'est mis à bouger dans le terminal ! wink

Le problème est que dans mon dossier miks_game, il y a un dossier deb_dist avec plein de trucs dedans mais pas de .deb et la console me dit qu'il manque debhelper.

Dernière modification par doudoulolita (Le 26/05/2011, à 15:28)

Hors ligne

#89 Le 26/05/2011, à 15:24

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

il faut installer le paquet python-stdeb smile sinon ça marchera pas…

sinon je pense que tes fichiers python n'ont pas les droits d'execution, tu veux plutot enregistrer un lancer (.desktop) dans le dossier, et dire à ton installeur de le mettre dans /user/share/applications

Hors ligne

#90 Le 26/05/2011, à 15:36

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

avec python-stdeb + debhelper, ça a l'air marcher, cette fois ! smile
J'ai un python-miksgame_1.0-1_all.deb dans le dossier deb_dist et quand je le lance avec gdebi, il ne fait pas la tête...
Par contre je ne trouve pas miks_game dans le menu Applications alors je vais redémarrer pour voir.

A noter que j'avais préalablement coché autoriser l'execution du fichier comme programme dans les propriétés de setup.py mais pas de miks_game.py.

Je recommence tout avant de redémarrer ! hmm

Dernière modification par doudoulolita (Le 26/05/2011, à 15:46)

Hors ligne

#91 Le 26/05/2011, à 16:01

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

J'ai bien tout recommencé, j'ai mon .deb dans deb_dist et quand je double-clique dessus, ça lance gdebi sans soucis.
gdebi me dit que c'est installé et je le retrouve sous le nom python-miksgame dans Synaptic.
Par contre, impossible de le trouver dans les menus ni de le lancer avec le terminal, même après un redémarrage.
Ce soir, j'uploaderai tout ça sur mon serveur pour que tu puisses jeter un oeil.

Hors ligne

#92 Le 26/05/2011, à 16:05

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Je viens de regarder l'archive miks_game-1.0.tar.gz crée initialement et en fait elle ne contient pas les images !
Je pense que je dois reprendre l'explication complexe pour refaire tout ça.

Hors ligne

#93 Le 26/05/2011, à 16:10

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

il y a des parametres data et autres pour envoyer des données… le setup.py d'usf est un peu complexe, mais il fait tout ça…

Hors ligne

#94 Le 26/05/2011, à 16:32

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Je vais tenter avec quelque chose comme ça pour setup.py mais j'ai un peu peur du plantage...

#!/usr/bin/env python

from distutils.core import setup
setup(name='miks_game',
      version='1.0',
      description='game for kids',
      author='Doudoulolita',    
      py_modules=['miks_game'],
      data_files=[('miks_game', ['arriereplan.png', 'arriereplan_cote.png', 'arriereplan_cote2.png', 'miks_roll2.png', 'miks_smackup2.png', 'miks_static.png', 'miks_walk2.png', 'tux_defaite.png', 'tux_victoire.png']),
      (item[0], item[1]) for item in files('data')]
      )

Hors ligne

#95 Le 26/05/2011, à 17:07

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Effectivement, ça plante et même si je vire  (item[0], item[1]) for item in files('data'), je n'arrive pas à incorporer les autres images dans l'archive avec python setup.py sdist

Hors ligne

#96 Le 27/05/2011, à 11:15

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Même si je n'ai pas terminé, je n'ai pas résisté à présenter mon jeu miks_game (sans setup.py) sur mon blog nounours :

blog OV

Dernière modification par doudoulolita (Le 24/06/2011, à 06:54)

Hors ligne

#97 Le 27/05/2011, à 13:43

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Voici maintenant mon setup.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from distutils.core import setup

setup(name='miks_game',
      version='1.0',
      description='game for kids',
      author='Doudoulolita',
      author_email='doudou-lolita@hotmail.fr',
      url='http://oursement-votre.com/document/',
      py_modules=['miks_game'],
     )

Pour inclure les images, il semble qu'il faille créer un autre fichier nommé MANIFEST.in:

include *.png
include *.py
include data/*.png

Si je fais python setup.py sdist dans la console (de préférence pas en root), j'obtiens bien une archive qui contient toutes mes images et le dossier data. Ca progresse ! smile

Si je le teste avec une installation, je le retrouve dans synaptic mais je ne parviens pas à le lancer avec la console. Il me dit que cette commande n'existe pas. hmm

Dernière modification par doudoulolita (Le 27/05/2011, à 14:08)

Hors ligne

#98 Le 27/05/2011, à 14:51

tshirtman

Re : Faire une animation sur la création de jeux vidéo libres

Hey, je viens d'aller voir, le résultat est pas mal quand même smile et bonne utilisation d'open game art smile

Bon, sur le code, tu fera mieux plus tard, c'est pas si dramatique que ce à quoi je m'attendais, je pense que je faisait pas mieux dans mes premières années de dev ^^

Hors ligne

#99 Le 28/05/2011, à 11:57

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Je pense que si j'ai relativement bien réussi mon petit jeu, c'est grâce à ton aide ( en plus de mon intelligence supérieure wink )
Ce qui est bien, c'est que tu ne me donnes pas la solution toute cuite mais des indices qui me permettent d'avancer, ou des corrections pour mes erreurs.

Je pense que ce mode d'apprentissage via un forum est très pratique car les tutoriels sont parfois très éloignés des problématiques auxquelles on est confrontés ou trop complexes.

Cela ne marche cependant que si on tombe sur quelqu'un comme toi qui sait s'adapter à son interlocuteur et qui ne fait pas à ma place. En fait, tu m'incites à trouver par moi-même comment faire, ce qui veut dire que tu es un très bon prof de programmation ! cool

Je regrette que ce post ne soit pas plus fréquenté mais d'un autre côté, trop d'interlocuteurs peut parfois être problématique. Sur le post d'USF, je ne ressens pas trop ce souci car chacun s'occupe de son truc tout en aidant les autres  mais sur d'autres forums, j'ai du mal à obtenir des réponses claires, parfois.

Là où c'est embêtant pour les jeunes dont je m'occupe à mon boulot et qui aimeraient créer des jeux vidéos, c'est que beaucoup de tutos sont en anglais et qu'ils ne le maîtrisent pas tous (ou pas suffisamment). Mais bon, s'ils en veulent vraiment, ils peuvent aussi apprendre l'anglais !

Dernière modification par doudoulolita (Le 28/05/2011, à 11:59)

Hors ligne

#100 Le 29/05/2011, à 11:48

doudoulolita

Re : Faire une animation sur la création de jeux vidéo libres

Ce niveau pour Ultimate Smash Friends a été réalisé par Abdellah,  un des jeunes qui vient à mon travail jouer en accès libre.

screenshot du niveau Papone    Il l'a nommé Papone.

Il est un des seuls du groupe des 10/15 ans qui avait envie de dessiner, je l'ai donc pris individuellement pendant que les autres jouaient. Je lui ai montré Inkscape et très rapidement l'outil Courbes de Béziers mais celui-ci ne l'intéressait pas car il le trouvait trop compliqué. Il a préféré s'entraîner avec les rectangles, les cubes et les spirales.

Je lui ai montré rapidement le principe des calques et il a voulu ajouter un personnage à son décor, ce qui manquait un peu de logique mais bon, il ne fait pas brimer la créativité ! wink
Il l'a réalisé de lui-même avec l'outil de tracé Calligraphique, qui lui a beaucoup plu.

outils d'inkscape   Papone dans Inkscape

J'ai d'abord nettoyé un peu ce qui me semblait en trop et replacé un peu les plate-formes (sinon, les personnages tombaient à leur arrivée dans le jeu  hmm  ).
Ensuite, j'ai vite fait pour lui un fichier xml afin qu'il puisse voir le niveau dans le jeu assez rapidement. C'est réalisé avec un simple éditeur de texte et le fichier est enregistré sous le nom level.xml.
Dans le fichier xml, on donne d'abord le nom du niveau, puis celui des 3 images utilisées (voir l'album)
Il n'y a que 3 plate-formes, nommées block dans le xml. Leurs coordonnées sont d'abord celles du coin supérieur gauche (position x puis position y) puis la taille du block (largeur puis hauteur).
En mettant des guides  horizontaux et verticaux dans Gimp et en regardant leur coordonnées dans la barre d'état quand on les déplace, on trouve facilement les coordonnées du coin des blocks. En resélectionnant le rectangle avec l'outil rectangle de sélection de Gimp, on obtient la taille du block dans la barre d'état.

<?xml version="1.0" encoding="UTF-8"?>
<map
    name="papone"
    background="background.png"
    foreground="foreground.png"
    middle="middle.png"
    margins="250,250,250,250"
    >
    <block coords="290 211 238 39" ></block>
    <block coords="599 400 294 46" ></block>
    <block coords="226 584 381 31" ></block>
</map>

Il suffit ensuite de mettre le dossier papone contenant les 4 images foreground.png, middle.png et background.png, screenshot.png + level.xml dans Ultimate-Smash-Friends/data/levels ( C:\Program Files\Ultimate Smash Friends\data\levels sous Windows 7 )

L'idéal serait d'ajouter du mouvement aux cubes, mais cela est un peu trop complexe pour l'instant.

Dernière modification par doudoulolita (Le 29/05/2011, à 12:17)

Hors ligne