#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.
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
#127 Le 25/07/2011, à 16:02
- tshirtman
Re : Faire une animation sur la création de jeux vidéo libres
bravo!
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 !
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 donc rien de particulier
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 !
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
#!/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)
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
#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