« Pygame/Concevoir des jeux avec Pygame » : différence entre les versions

Et voilà, votre jeu Pyagme le plus basique. Tous les jeux prendront une forme similaire, mais avec beaucoup plus de code concernant les fonctions de jeu elles-mêmes, celles-ci seront plus à coder par vous au moment de la programmation, et seront moins guidée dans leur structure par le fonctionnement de Pygame. C'est la vraie raison de ce tutoriel, et nous rentrons maintenant dans le vif du sujet.
 
==Kicking thingsCoup d'envoi off==
 
Les premières sections du code sont relativement simples, et une fois écrites peuvent habituellement être réutilisées dans tous les jeux que vous programmerez. Elles s'occuperont de toutes les tâches fastidieuses et génériques comme : charger des modules, charger des images, ouvrir des connections réseau, jouer de la musique, etc. Elles inclueront également de simples mais efficaces gestionnaire d'erreurs, et les quelques personnalisations que vous souhaiterez effectuer par dessus les fonctions fournies par des modules comme <tt>sys</tt> et <tt>pygame</tt>.
===The first lines, and loading modules===
 
===Resource handling functions===
=== Les premières lignes et le chargement de modules ===
 
Tout d'abord, vous avez besoin de démarrer votre jeu et de charger vos modules. C'est toujours une bonne idée de définir certaines choses directement en haut du fichier source principal, comme : le nom du fichier, ce qu'il contient, sa licence, ainsi que n'importe quelle autre information que vous jugerez utile de faire lire à ceux qui la regarde. Ensuite vous pouvez charger des modules, agrémenté d'une gestion d'erreur qui fera en sorte que Python ne vous affichera pas ces horribles ''traceback'' que les non-programmeurs ne comprennent pas. Le code est très simple, je ne m'étendrai pas dessus :
 
<source lang="python">
#!/usr/bin/env python
# coding: utf-8
#
# Tom's Pong
# A simple pong game with realistic physics and AI
# http://www.tomchance.uklinux.net/projects/pong.shtml
#
# Released under the GNU General Public License
 
VERSION = "0.4"
 
try:
import sys
import random
import math
import os
import getopt
import pygame
from socket import *
from pygame.locals import *
except ImportError, err:
print "Impossible de charger le module. %s" % (err)
sys.exit(2)
</source>
 
=== Fonctions de gestion des ressources ===
 
Dans l'exemple [[Pygame/Chimp_-_Ligne_par_ligne|Chimp - Ligne par ligne]], le premier code à être écrit correspond au chargement des images et des sons. Etant donné que c'est totalement indépendant de la logique de jeu et/ou des objets de jeu, elles seront écrites en premier et dans des fonctions séparées, ce qui impliquera que le code qui s'ensuivra pourra les utiliser. Je mets généralement tout mon code de cette nature au départ, dans leur propre fonctions, sans classe. Cela correspondra aux fonctions de gestions des ressources. Vous pouvez bien sûr créer des classes pour celle-ci, c'est à vous de développer votre propre style et vos meilleures pratiques.
 
C'est toujours une bonne idée d'écrire vos propres fonctions de gestion de ressources, car bien que Pygame possède des méthodes pour l'ouverture des images et des sons (ainsi que d'autres modules qui possèdent eux aussi leurs propres méthodes pour l'ouverture d'autres ressources), ces méthodes peuvent prendre plus d'une ligne, et peuvent requérir de consistantes modifications faites par vous-mêmes, et bien souvent elles ne fournissent pas de gestion d'erreur satisfaisante. Ecrire des fonction de gestion de ressources vous donne un code sophistiqué, réutilisable, et vous offre plus de contrôle sur vos ressources. Prenez cet exmple d'une fonction de chargement d'image :
 
<source lang="python">
def load_png(name):
"""Charge une image et retourne un objet image"""
fullname = os.path.join('data', name)
try:
image = pygame.image.load(fullname)
if image.get_alpha() is None:
image = image.convert()
else:
image = image.convert_alpha()
except pygame.error, message:
print 'Impossible de charger l'image : ', fullname
raise SystemExit, message
return image, image.get_rect()
</source>
 
Ici nous avons créé une fonction de chargement d'image plus sophistiquée que celle fournie par Pygame : <tt>image.load()</tt>. A noter que la première ligne de la fonction débute par un ''docstring'' (chaine de caractère de documentation) qui décrit ce que fait la fonction et quel objet elle retourne. La fonction suppose que toutes vos images soient dans un répertoire appelé <tt>data<tt>, et donc utilisera le nom de fichier et créera le chemin complet (par exemple <tt>data/ball.png</tt>), en utilisant le module <tt>os</tt> pour s'assurer de la compatibilité entre plateforme différente (Linux, MacOS, Windows, ...). Ensuite elle essaye de charger l'image, et de convertir les régions alpha (ce qui vous permettra d'utiliser la transparence), et le cas échéant retourne une erreur ''lisible par un être humain'' si elle rencontre un problème. Finalement elle retourne un objet image, ainsi que son <tt>rect</tt>.
 
Vous pouvez créer des fonctions similaires pour le chargement de n'importe quelle autre ressource, tel que le chargement des sons. Vous pouvez aussi créer des classes de gestion de ressources, pour vous donner plus de flexibilité avec des ressources plus complexes. Par exemple, vous pouvez créer une classe <tt>Music</tt>, avec une fonction <tt>__init__()</tt> qui charge le son (peut-être en empruntant la fonction <tt>load_sound()</tt>), une méthode pour mettre en pause la musique, une méthode pour la redémarrer. Une autre classe de gestion de ressources utile peut être créée pour les connexions réseau. Des fonctions pour ouvrir des [[Apprendre à programmer avec Python/Communications à travers un réseau|sockets]], passer des données avec une sécurité appropriée et muni d'un contrôle d'erreur, fermer des sockets, [http://jargonf.org/wiki/finger finger] des adresses, ainsi que d'autres tâches concernant le réseau, pourront rendre l'écriture d'un jeu avec des capacités réseau moins pénible.
 
Souvenez-vous que la tâche première de ces fonctions/classes est de s'assurer qu'avec le temps, l'écriture des classes d'objet, et de la boucle principale, il n'y ait presque plus rien à faire. L'héritage de classes peut rendre ces classes de bases utiles. Ne vous emballez pas, des fonctions qui ne seront utilisées que par une classe devront être écrites dans cette classe, et non pas dans une fonction globale.
 
==Game object classes==
54

modifications