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.

#126 Le 25/07/2011, à 14:48

doudoulolita

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

Ca marche en nommant mon script mks à la fois dans setup.py et dans MANIFEST.in.  smile
Je crée ensuite mon .deb et fait l'installtion via Gdebi.

fichier mks (sans extension):

#!/usr/bin/env sh

python /usr/share/pyshared/miks_game.py

Ajout dans la partie setup de setup.py:

      scripts=['mks']

MANIFEST.in :

recursive-include data *.png
recursive-include images *.png
include mks
include *.py

Bien sûr, il faut lancer mks depuis la console. Pas encore de lanceur graphique. Mais j'ai un vrai paquet debian qui fonctionne !

Dernière modification par doudoulolita (Le 25/07/2011, à 14:54)

Hors ligne

#128 Le 28/07/2011, à 14:01

doudoulolita

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

J'ai dans la tête quelques idées d'autres jeux très simples pour m'entraîner, je ne sais pas si je les ferai un jour mais je note pour m'en souvenir:
- Un jeu identique à Miks Game mais pour des adultes grands débutants en informatique, peut-être tout bêtement avec des voitures, ou alors des personnages adultes un peu réalistes. Ca permet d'apprendre à utiliser la souris, donc pour certains seniors, ça peut encore être utile.
- Un jeu avec des chiffres sur des chaises et il faut que les personnages s'assoient dans l'ordre des chiffres. Pour enfants !
- Un jeu pour fabriquer un dessin de nounours personnalisé avec des yeux, des bras et des jambes différents. J'avais fait un truc en php pour faire un patron de nounours personnalisé, ce serait un peu le même principe mais avec Pygame et pour des enfants.

Hors ligne

#129 Le 28/07/2011, à 16:06

doudoulolita

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

Hors ligne

#130 Le 03/08/2011, à 23:06

doudoulolita

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

J'ai installé le .deb que j'ai créé sur un autre poste Ubuntu et la commande mks a fonctionné. J'ai mis un lanceur sur le bureau avec cette commande (clic droit > créer un lanceur) puis j'ai changé l'icône en utilsant les propriétés (clic droit sur le lanceur)

Je voulais faire un raccourci sur le bureau vers le dossier /usr/share/pyshared/data, mais se pose les problèmes de droits, qui m'énervent toujours sur Linux, j'avoue. Pour un débutant en informatique, cette opération sera trop complexe donc je devrai sans doute déplacer ce dossier data ailleurs, dans le dossier personnel par exemple, dans un futur paquet. C'est là que se pose le problème du nom de l'utilisateur (user)

J'ai remarqué aussi que mon .deb avait le même numéro de version que lors de mes essais précédents, je pense qu'il faut que je le change au fur et à mesure des améliorations.

Hors ligne

#131 Le 02/09/2011, à 14:17

doudoulolita

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

Retour sur les bases de pygame avec une petite variation sur ce  tuto et son code qui affiche le temps de jeu dans la barre de titre et dans la console.

Pour ma part, j'ai fait afficher la durée du jeu directement dans la fenêtre:

# -*- coding: utf-8 -*-

import pygame
pygame.init()

screen = pygame.display.set_mode((640,480)) # crée la fenêtre
background = pygame.Surface(screen.get_size()) # crée la surface de fond
background.fill((255,255,255)) # remplit le fond de blanc
background = background.convert() # convertit le fond pour un affichage plus rapide


clock = pygame.time.Clock() # crée l'objet horloge
mainloop = True # initialise la boucle
FPS = 30 # temps de chargement des frames
playtime = 0.0 # initialise le temps de jeu

while mainloop:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainloop = False # la fenêtre est fermée par l'utilisateur avec la croix
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                mainloop = False # l'utilisateur presse la touche ECHAP pour fermer la fenêtre

    pygame.display.set_caption("durée du jeu: %.2f seconds" % playtime) # affiche le texte dans la barre de titre

    screen.blit(background, (0, 0)) # affiche le fond

    texte = "ce jeu dure depuis %.2f secondes" % playtime

    ma_police = pygame.font.SysFont("arial", 30) # choisit la police d'écriture
    surface_texte = ma_police.render(texte, True, (0,0,0)) # définit la surface de texte
    screen.blit(surface_texte, (10,10)) # affiche la surface de texte

    milliseconds = clock.tick(FPS) # ne va pas plus vite que ce temps de chargement
    playtime += milliseconds / 1000.0 # ajoute des secondes au temps de jeu
    pygame.display.flip() # réaffiche le contenu de pygame
pygame.quit() # on quitte pygame

Hors ligne

#132 Le 09/09/2011, à 10:56

doudoulolita

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

Finalement, il me semble possible de faire tester le jeu Ultimate Smash Friends (et en particulier la force des persos) par les enfants de mon boulot.
On prendra  seulement 3 ou 4 enfants d'une dizaine d'années motivés, et on fera des captures d'écran (avec
recordmydesktop si ça marche bien) tout en enregistrant leur commentaires (audio).
On a déjà fait ce type d'animation sur Windows avec d'autres jeux et ça leur avait bien plu.

Petit souci: la version dans les dépots pour Ubuntu Lucid Lynx est assez ancienne, les persos sont encore Bix et Blob. Je dois donc semble-t-il installer la dernière version avec bzr et prévoir un lanceur pour faciliter l'accès au jeu.

Hors ligne

#133 Le 09/09/2011, à 11:01

doudoulolita

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

Comme indiqué sur la page recordmydesktop , il faut ajouter à ce paquet (déjà installé dans ma version d'Ubuntu) un autre paquet pour le mode graphique: gtk-recordmydesktop, ce qui est facile à faire avec Synaptic.
Cela permet ensuite d'avoir le lien dans le menu Applications > Son et video

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

Hors ligne

#134 Le 09/09/2011, à 11:16

tshirtman

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

oui j'utilise beaucoup gtk-recordmydesktop en ce moment, et pitivy pour découper après, ça marche bien, bon desfois le bouton "stop" de gtk-recordmydesktop ne fait rien, alors je fais "killall recordmydesktop" (ce qui revient au même, on perds pas la vidéo).

Hors ligne

#135 Le 09/09/2011, à 12:30

doudoulolita

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

Après quelques essais, grognements et ronchonnements , j'ai trouvé le raccourci clavier pour arrêter gtk-recordmydesktop : CTRL+ Alt (celui de gauche) + S
Chez moi, la fenêtre de gtk-recordmydesktop disparaît quand on appuie sur le bouton enregistrer, ça surprend ! mad
On trouve ce raccourci sur la page http://doc.ubuntu-fr.org/recordmydesktop dans la partie consacrée au mode ligne de commande.

Pour quitter le programme en ligne de commande, j'avais moi aussi trouvé:

killall -TERM recordmydesktop

Je ne sais pas ce que -TERM ajoute ici.

Dernière modification par doudoulolita (Le 09/09/2011, à 12:36)

Hors ligne

#136 Le 09/09/2011, à 12:40

tshirtman

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

TERM est le signal par défaut tongue donc rien de particulier smile

Hors ligne

#137 Le 23/09/2011, à 09:48

doudoulolita

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

gtk-recordmydesktop refusait de s'éteindre sur un des postes, j'ai donc testé recorditnow, autre interface graphique de recordmydesktop.

Problème de fermeture du programme identique sur ce poste (c'est recordmydesktop qui est en cause car le killall ne marche pas non plus) mais sur un autre poste, les 2 interfaces graphiques fonctionnaient. Ce qui est étrange car tous nos postes sont censés être identiques ! tongue

Pour l'instant, la vidéo de recorditnow est saccadée mais on n'a mis que 15 img/s. A noter que là, il n'y a pas besoin du raccourci clavier, il y a un bouton pour arrêter la vidéo. Comme pour gtk-recordmydesktop, il ne vaut mieux ne pas délimiter une partie de l'écran car le cadre ne disparaît pas toujours ensuite.

VLC a aussi en principe possibilité de faire du screencast mais ça bogue. Le bogue est très joli (écran en cascade) donc je vous invite à le tester, mais ça ne résoud pas mon problème !

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

Hors ligne

#138 Le 23/09/2011, à 10:00

doudoulolita

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

A l'heure actuelle, voici les opérations techniques que je dois faire pour préparer l'animation:

    *      désinstallation de la version actuelle d'USF via Synaptic (vérifier d'abord s'il y a un lanceur dans le menu jeux)
    *      désinstallation des fichiers de configuration (fichiers cachés) de la version actuelle dans le dossier personnel
    *      installation de bazaar via Synaptic (bzr) ou en ligne de commande
    *      téléchargement de la version de développement d'USF via bazaar par ligne de commande
    *      pour le screencast = vérification de l'installation de recordmydesktop et installation de la version graphique gtk-recordmydesktop ou recordmydesktop via synaptic

Comme nous recevons en ce moment un stagiaire CATIC, je lui ai expliqué toutes ces démarches et les ai notés en détail sur notre wiki, ce qui lui apprend beaucoup de choses sur Linux. C'est peut-être lui qui fera l'animation si nous résolvons rapidement les problèmes de screencast (il part dans une dizaine de jours !)

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

Hors ligne

#139 Le 26/09/2011, à 23:00

doudoulolita

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

Je me lance dans le module Sprite sans trop y parvenir. Je me suis aidée du tuto piman's writing.
Il y a 2 persos avec chacun son dossier: miks et rizzie. Chacun a 2 images dans son dossier, static.png et walk1.png.
On doit donc voir 2 persos qui avancent vers la droite l'un au dessous de l'autre.

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

# donne la largeur et la hauteur de l'écran
largeur_ecran = 900
hauteur_ecran = 472

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

class Perso(pygame.sprite.Sprite):    
    """ Un sprite défini par son nom, son image et la position de son image"""
    images = ["static.png", "walk.png"]
    image = None

    def __init__(self, nom, x, y, fps = 10):
        pygame.sprite.Sprite.__init__(self)
        self.nom = nom
        self.im = 0
        if self.image is None:
            self.image = pygame.image.load(self.nom+"/"+self.images[0])
        else: 
            self.image = pygame.image.load(self.nom+"/"+self.images[1])
        self.image = self.image.convert_alpha(self.image)
        self._images = self.images[self.im]
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.time= pygame.time.get_ticks()
        self.delay = 1000/ fps
        self.update1 = 0
        self.update(pygame.time.get_ticks())

    def affiche(self, image, (x,y)):
        self.im = 0       
        screen.blit(self.image, (x, y))      
 
    def update(self, time):
        self.rect.right += 1
        if time - self.update1 > self.delay:
            self.im += 1
            if self.im > len(self.images):
                self.im = 0
                self.image = self._images[self.im]
                self.raffraichissement = time
                                       
#initialise pygame
pygame.init()

# définit la taille de la fenêtre
screen = pygame.display.set_mode((largeur_ecran, hauteur_ecran), 0, 32)
# donne le titre de la fenêtre
pygame.display.set_caption("Miks et rizzie vont-ils going_left ?")

# les sprites 'miks' et 'rizzie' avec leurs noms, le nom de leur image et leur position
persos = { 'miks':Perso("miks", 100, 100), 'rizzie':Perso("rizzie", 100, 200) } 
time = 0
while True:    
    # pour fermer la fenêtre
    for event in pygame.event.get():
        if event.type == QUIT:
            exit() 
    # affiche l'arriere-plan 
    background = screen.fill((255,255,255)) 
    for i in persos:   
        persos[i].affiche(persos[i].image, persos[i].rect.topleft)
        persos[i].update(time)

    # réactualise l'affichage
    pygame.display.update()

Le résultat n'est pas à la hauteur de mes espérances car si les persos avancent bien de 1px à chaque frame ( self.rect.right += 1 dans la fonction update), ils ne bougent pas les jambes, c'est toujours la même image static.png qui s'affiche. Décidément, les sprites, c'est pas facile à manipuler !

J'essaierai de commenter le code un peu plus quand j'aurai le temps.

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

Hors ligne

#140 Le 26/09/2011, à 23:11

tshirtman

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

si tu veux éviter de faire une boucle avec un += et un test, tu peux faire un cycle avec le module ittertools

>>> itertools.cycle(range(2))
<itertools.cycle object at 0x28e8998>
>>> a = itertools.cycle(range(2))
>>> a.next()
0
>>> a.next()
1
>>> a.next()
0
>>> a.next()
1
>>> a.next()
0
>>> a.next()
1
>>> a.next()
0
>>> a.next()
1
>>> 

remplace range(2) par self._images, et remplace tout ça:

       self.rect.right += 1
        if time - self.update1 > self.delay:
            self.im += 1
            if self.im > len(self.images):
                self.im = 0
                self.image = self._images[self.im]
                self.raffraichissement = time

par

    self.image = a.next()

(bon, tu peux trouver un meilleurs nom que "a", bien sur).

Hors ligne

#141 Le 27/09/2011, à 00:16

doudoulolita

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

J'ai importé le module avec

import itertools

puis j'ai changé ma fonction update:

    def update(self, time):
        frame = itertools.cycle(self._images)
        self.image = frame.next()

Résultat:

  File "17_class_sprite_miks.py", line 64, in <module>
    persos[i].affiche(persos[i].image, persos[i].rect.topleft)
  File "17_class_sprite_miks.py", line 39, in affiche
    screen.blit(self.image, (x, y)) 
TypeError: argument 1 must be pygame.Surface, not str

Dernière modification par doudoulolita (Le 27/09/2011, à 00:33)

Hors ligne

#142 Le 27/09/2011, à 00:46

doudoulolita

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

Là, ça ne plante pas mais les persos ne bougent toujours pas les jambes hmm

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

# donne la largeur et la hauteur de l'écran
largeur_ecran = 900
hauteur_ecran = 472

# importe la bibliothèque Pygame
import pygame
from pygame.locals import *
from sys import exit
from Vector2 import *
import itertools

class Perso(pygame.sprite.Sprite):    
    """ Un sprite défini par son nom, son image et la position de son image"""
    images = ['static.png', 'walk.png']

    def __init__(self, nom, x, y, fps = 10):
        pygame.sprite.Sprite.__init__(self)
        self.nom = nom
        self.image = pygame.image.load(self.nom+"/"+self.images[0]).convert_alpha()
        self.image2 = pygame.image.load(self.nom+"/"+self.images[1]).convert_alpha()
        self.images =[self.image, self.image2]
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.time= pygame.time.get_ticks()
   
    def affiche(self, image, (x,y)):     
        screen.blit(self.image, (x, y)) 

    def update(self, time):
        self.rect.right += 1
        frame = itertools.cycle(self.images)
        self.image = frame.next()

Ensuite, tout est identique à tout à l'heure.

Dernière modification par doudoulolita (Le 29/09/2011, à 10:29)

Hors ligne

#143 Le 27/09/2011, à 07:41

tshirtman

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

arf, non il faut définir frame(s) dans __init__ (donc self.frames) sinon là tu réinitialise à chaque fois la séquence.

Hors ligne

#144 Le 27/09/2011, à 13:32

doudoulolita

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

Retour sur l'installation de recorditnow au boulot, hyper saccadé même à 25 ou 30 frames /s.

Hors ligne

#145 Le 27/09/2011, à 13:56

doudoulolita

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

Avec gtk-recordmydesktop, cela marche sur plusieurs postes, très fluide, et surtout, grand avantage, sur celui qui est relié au vidéoprojecteur. A la limite, celui-là peut nous suffire pour notre animation.
Par contre, on ne peut transférer directement le fichier vidéo .ogv sur youtube (vidéo du plus beau vert) ni l'importer dans Kdenlive (pixels de couleurs étranges, rien de reconnaissable) sad
Je vais voir si on peut choisir un autre format dans recordmydesktop ou trouver facilement un convertisseur.
L'idée à l'heure actuelle est de faire jouer 2 enfants sur le poste du vidéoprojecteur, ils font la capture d'écran et les commentaires des autres enfants qui regardent le grand seront enregistrés.
La vidéo une fois montée devra être mise sur Youtube ou Dailymotion pour que toi, Tshirtman puisse la voir (et les enfants plus tard)
On peut aussi leur donner des tableaux à emplir avec des commentaires écrits, mai ils aiment beaucoup moins.

Dernière modification par doudoulolita (Le 27/09/2011, à 13:58)

Hors ligne

#146 Le 27/09/2011, à 15:16

tshirtman

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

ah oui, en général je passe un coup de ffmpeg si je veux l'envoyer sur youtube, j'avais le même soucis de vidéo toute verte…

ffmpeg -i ton_fichier.ogv nouveau_fichier.avi

juste comme ça ça suffit je pense.

Hors ligne

#147 Le 29/09/2011, à 12:31

doudoulolita

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

J'ai enfin réussi à faire marcher Miks et Rizzie ! C'est pas super super joli mais le principe est OK.
J'ai aussi commenté mon code.

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

# donne la largeur et la hauteur de l'écran
largeur_ecran = 900
hauteur_ecran = 472

# importe la bibliothèque Pygame
import pygame
from pygame.locals import *
from sys import exit
from Vector2 import *
import itertools

class Perso(pygame.sprite.Sprite):    
    """ Un sprite défini par son nom, ses 2 images et la position du rectangle qui inclut son image"""
    images = ['static.png', 'walk.png']
    # la liste des images de mouvements d'un sprite : statique et marche. Elles donneront les frames.

    def __init__(self, nom, x, y, fps = 10):
        pygame.sprite.Sprite.__init__(self)
        self.nom = nom # le nom du sprite sera celui donné en argument
        self.image = pygame.image.load(self.nom+"/"+self.images[0]).convert_alpha() 
        self.image2 = pygame.image.load(self.nom+"/"+self.images[1]).convert_alpha()
        # télécharge les 2 images de la liste images en ajoutant le nom du dossier du personnage
        self.frame =[self.image, self.image2] # liste les frames
        self.rect = self.image.get_rect() # surface du rectangle correspondant à l'image
        self.rect.topleft = (x, y) # coordonnées du coin haut droit du rectangle du sprite
        self.time = pygame.time.get_ticks() # horloge
   
    def affiche(self, image, (x,y)):     
        screen.blit(self.image, (x, y)) # affiche l'image à la position indiquée

    def update(self, time):
        self.rect.right += 1 # bouge le rectangle de l'image d'1px vers la droite
        self.frame = itertools.cycle(self.frame) # pour définir la frame à utiliser, parcourt la liste self.frames
        self.image = self.frame.next() # prend la frame suivante de la liste self.images comme nouvelle image
        
#initialise pygame
pygame.init()

# définit la taille de la fenêtre
screen = pygame.display.set_mode((largeur_ecran, hauteur_ecran), 0, 32)
# donne le titre de la fenêtre
pygame.display.set_caption("Miks et rizzie vont-ils marcher correctement ?")

# dictionnaire des sprites: 'miks' et 'rizzie' avec leurs noms, le nom de leur image et leur position
persos = { 'miks':Perso("miks", 100, 100), 'rizzie':Perso("rizzie", 100, 200) } 
time = 0 # intitalise l'heure

while True:    
    # pour fermer la fenêtre
    for event in pygame.event.get():
        if event.type == QUIT:
            exit() 
    # affiche l'arriere-plan en blanc
    background = screen.fill((255,255,255))
    # parcourt le dictionnaire des personnages (persos)
    for i in persos:   
        persos[i].affiche(persos[i].image, persos[i].rect.topleft) # utilise la fonction affiche pour afficher les images
        persos[i].update(time) # utilise la fonction update pour passer à l'image suivante

    # réactualise l'affichage
    pygame.display.update()

Hors ligne

#148 Le 29/09/2011, à 13:26

tshirtman

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

Je ne vois pas comment ça peut marcher >_<

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

# donne la largeur et la hauteur de l'écran
largeur_ecran = 900
hauteur_ecran = 472

# importe la bibliothèque Pygame
import pygame
#from pygame.locals import * # évite ce genre de code, tu n'utilise rien de cet import *, c'est une pollution inutile de ton namespace
from sys import exit
#from Vector2 import * # pareil, évite le import *, importe les noms explicitement, comme tu fais pour exit à la ligne au dessus
from itertools import cycle

class Perso(pygame.sprite.Sprite):    
    """ Un sprite défini par son nom, ses 2 images et la position du rectangle qui inclut son image"""
    images = ['static.png', 'walk.png']
    # la liste des images de mouvements d'un sprite : statique et marche. Elles donneront les frames.

    def load_image(self, name):
        return pygame.image.load(self.nom + "/" + img).convert_alpha()

    def __init__(self, nom, x, y, fps = 10):
        pygame.sprite.Sprite.__init__(self)
        self.nom = nom # le nom du sprite sera celui donné en argument
        # télécharge les 2 images de la liste images en ajoutant le nom du dossier du personnage
        self.frames = cycle(map([self.load_image(x) for x in self.images]) # ittérateur sur les images chargées

        self.pos = (x, y) # coordonnées du coin haut droit du rectangle du sprite
   
    def affiche(self):
        screen.blit(self.image, self.x - self.rect.width / 2, self.y - self.rect.height) # affiche l'image de telle sorte que x, y soit au milieu du bords bas de l'image.

    def update(self, time):
        self.pos[0] += 10.0 / time # bouge le rectangle de l'image de 10px vers la droite par secondes
        self.image = self.frames.next() # prend la frame suivante de la liste self.images comme nouvelle image
        self.rect = self.image.get_rect() # surface du rectangle correspondant à l'image

if __name__ == '__main__':
    #initialise pygame
    pygame.init()

    # définit la taille de la fenêtre
    screen = pygame.display.set_mode((largeur_ecran, hauteur_ecran), 0, 32)
    # donne le titre de la fenêtre
    pygame.display.set_caption("Miks et rizzie vont-ils marcher correctement ?")

    # dictionnaire des sprites: 'miks' et 'rizzie' avec leurs noms, le nom de leur image et leur position
    persos = { 'miks':Perso("miks", 100, 100), 'rizzie':Perso("rizzie", 100, 200) }

    pygame.time.get_ticks() # horloge

    while True:
       time = pygame.time.get_ticks() # horloge

        # pour fermer la fenêtre
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()

        # affiche l'arriere-plan en blanc
        background = screen.fill((255,255,255))
        # parcourt le dictionnaire des personnages (persos)
        for i in persos:
            persos[i].update(time) # utilise la fonction update pour passer à l'image suivante
            persos[i].affiche() # utilise la fonction affiche pour afficher les images

        # réactualise l'affichage
        pygame.display.update(time)

Bon, j'ai pas testé (je peux pas ici), mais ça devrait être un peu mieux comme ça, s'il y a des trucs que tu comprends pas, demande.

Hors ligne

#149 Le 29/09/2011, à 14:55

doudoulolita

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

Un petit perfectionnement: les personnages  peuvent aller à gauche ou à droite selon les flèches du pavé directionnel qu'on utilise. Et les personnages se retournent dans le bon sens grâce au code que j'ai inclus dans la fonction nommée agauche

        self.image = pygame.transform.flip(self.image, 1, 0)
        self.image2 = pygame.transform.flip(self.image2, 1, 0)

Code entier du programme à ce stade:

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

# donne la largeur et la hauteur de l'écran
largeur_ecran = 900
hauteur_ecran = 472

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

class Perso(pygame.sprite.Sprite):    
    """ Un sprite défini par son nom, ses 2 images et la position du rectangle qui inclut son image"""
    images = ['static.png', 'walk.png']
    # la liste des images de mouvements d'un sprite : statique et marche. Elles donneront les frames.

    def __init__(self, nom, x, y, fps = 10):
        pygame.sprite.Sprite.__init__(self)
        self.nom = nom # le nom du sprite sera celui donné en argument
        self.image = pygame.image.load(self.nom+"/"+self.images[0]).convert_alpha() 
        self.image2 = pygame.image.load(self.nom+"/"+self.images[1]).convert_alpha()
        # télécharge les 2 images de la liste images en ajoutant le nom du dossier du personnage
        self.frame =[self.image, self.image2] # liste les frames
        self.rect = self.image.get_rect() # surface du rectangle correspondant à l'image
        self.rect.topleft = (x, y) # coordonnées du coin haut droit du rectangle du sprite
        self.time = pygame.time.get_ticks() # horloge
   
    def affiche(self, (x,y)):
        screen.blit(self.image, (x, y)) # affiche l'image à la position indiquée
        pygame.time.wait(2) # attend 2 ms
        
    def adroite(self, time):
        self.rect.right += 1 # bouge le rectangle de l'image de 1px vers la droite
        
    def agauche(self, time):
        # retourne l'image vers la gauche
        self.image = pygame.transform.flip(self.image, 1, 0)
        self.image2 = pygame.transform.flip(self.image2, 1, 0) 
        self.rect.right -= 1 # bouge le rectangle de l'image de 1px vers la gauche       
        
    def update(self, time):
        self.frame = itertools.cycle(self.frame) # pour définir la frame à utiliser, parcourt la liste self.frames
        self.image = self.frame.next() # prend la frame suivante de la liste self.images comme nouvelle image
        
#initialise pygame
pygame.init()

# définit la taille de la fenêtre
screen = pygame.display.set_mode((largeur_ecran, hauteur_ecran), 0, 32)
# donne le titre de la fenêtre
pygame.display.set_caption("Miks et rizzie vont-ils marcher correctement ?")

# dictionnaire des sprites: 'miks' et 'rizzie' avec leurs noms, le nom de leur image et leur position
persos = { 'miks':Perso("miks", 100, 100), 'rizzie':Perso("rizzie", 100, 200) } 
time = 0 # intitalise l'heure

while True:    
    # pour fermer la fenêtre
    for event in pygame.event.get():
        if event.type == QUIT:
            exit() 
    # affiche l'arriere-plan en blanc
    background = screen.fill((255,255,255))
    
    if event.type == KEYDOWN:
        if event.key == K_RIGHT:
            for i in persos:   
                persos[i].adroite(time) # utilise la fonction adroite pour avancer d1px vers la droite 
                persos[i].affiche(persos[i].rect.topleft) # utilise la fonction affiche pour afficher les images            
                persos[i].update(time) # utilise la fonction update pour passer à l'image suivante  
            
        elif event.key == K_LEFT:
            for i in persos: 
                persos[i].agauche(time) # utilise la fonction agauche pour reculer d1px vers la gauche
                persos[i].affiche(persos[i].rect.topleft) # utilise la fonction affiche pour afficher les images             
                persos[i].update(time) # utilise la fonction update pour passer à l'image suivante               
    else:                                                
        for i in persos: 
            # parcourt le dictionnaire des personnages (persos)
            persos[i].affiche(persos[i].rect.topleft) # utilise la fonction affiche pour afficher les images
        
    # réactualise l'affichage
    pygame.display.update()

J'aimerai maintenant pouvoir choisir le perso qui agit grâce à la touche M pour miks et à la touche R pour rizzie mais j'ai du mal à trouver comment conserver ce choix d'un bout à l'autre de la boucle.

Peut-être est-ce à ce stade que je dois créer un groupe qui contiendra mes persos ?

Dernière modification par doudoulolita (Le 30/09/2011, à 08:42)

Hors ligne

#150 Le 29/09/2011, à 17:29

doudoulolita

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

Tshirtman a écrit :

#from pygame.locals import * # évite ce genre de code, tu n'utilise rien de cet import *, c'est une pollution inutile de ton namespace
from sys import exit
#from Vector2 import * # pareil, évite le import *, importe les noms explicitement, comme tu fais pour exit à la ligne au dessus
from itertools import cycle

Cette ligne de code ne suffit pas

from itertools import cycle # remplace la ligne: import itertools

J'obtiens:

  File "20_class_sprite_miks.py", line 73, in <module>
    persos[i].update(time) # utilise la fonction update pour passer à l'image suivante  
  File "20_class_sprite_miks.py", line 45, in update
    self.frame = itertools.cycle(self.frame) # pour définir la frame à utiliser, parcourt la liste self.frames
NameError: global name 'itertools' is not defined

Si je vire cette autre ligne:

from pygame.locals import *

J'obtiens:

Traceback (most recent call last):
  File "20_class_sprite_miks.py", line 61, in <module>
    if event.type == QUIT:
NameError: name 'QUIT' is not defined

Par contre, comme je ne l'utilise pas ici,  on peut virer sans problème:

from Vector2 import *

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

Hors ligne