Outils pour utilisateurs

Outils du site


nsi:tds:pygame:plateforme:image_loader

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:pygame:plateforme:image_loader [2023/03/18 22:03] goupillwikinsi:tds:pygame:plateforme:image_loader [2023/03/19 11:43] (Version actuelle) – [level.py] goupillwiki
Ligne 8: Ligne 8:
  
 On crée un dossier ''images'' qui contiendra les  images de l'archive : {{ :nsi:tds:pygame:plateforme:images.zip |}}. Ainsi toutes les images seront bien rangées. On crée un dossier ''images'' qui contiendra les  images de l'archive : {{ :nsi:tds:pygame:plateforme:images.zip |}}. Ainsi toutes les images seront bien rangées.
 +
 +
 +===== Le gestionnaire =====
  
 On crée ensuite le gestionnaire : On crée ensuite le gestionnaire :
  
 <code python> <code python>
-#imageloader.py+#image.py
  
 import pygame import pygame
Ligne 31: Ligne 34:
     "upcenter":{     "upcenter":{
         "filename": 'upcenter.png',         "filename": 'upcenter.png',
-        "size": (30,30) 
-    }, 
-    "left":{ 
-        "filename": 'left.png', 
-        "size": (30,30) 
-    }, 
-    "right":{ 
-        "filename": 'right.png', 
-        "size": (30,30) 
-    }, 
-    "center":{ 
-        "filename": 'center.png', 
         "size": (30,30)         "size": (30,30)
     }     }
Ligne 74: Ligne 65:
 La fonction consiste à vérifier si l'image demandée est déjà stockée dans ''loaded''. Si ce n'est pas le cas, la fonction fait le chargement et stocke le résultat dans ''loaded'' de sorte qu'à la prochaine demande, le chargement sera inutile. La fonction consiste à vérifier si l'image demandée est déjà stockée dans ''loaded''. Si ce n'est pas le cas, la fonction fait le chargement et stocke le résultat dans ''loaded'' de sorte qu'à la prochaine demande, le chargement sera inutile.
  
-On peut alors modifier le script ''coin.py'' :+===== sprite fixe =====
  
-<code python> +Une bonne part des sprites que nous devrons afficher sont des sprites fixesC'est le cas des ''Coin'' et des ''Rectangle''À la création d'un ''Rectangle'', nous devions spécifier des dimensionsMais si le ''Rectangle'' est créé avec une image, l'image va donner les dimensions.
-# coin.py +
- +
-import pygame +
-import imageloader +
-from abc import abstractmethod +
- +
-class Coin(pygame.sprite.Sprite): +
-    TYPES = { +
-        "dollar":+
-            "name": 'dollar', +
-            "valeur":10 +
-        } +
-    } +
-      +
-    def __init__(self, x, y, coin_type): +
-        """ +
-        x, y: position du centre de la pièce +
-        coin_type: type de pièce +
-        Cette fonction crée une récompense +
-        """ +
-        super().__init__() +
-        assert coin_type in Coin.TYPES +
-        attributes = Coin.TYPES[coin_type] +
-        self.image = imageloader.load(attributes["name"]) +
-        self.valeur = attributes["valeur"+
-        ... +
-</code>+
  
-Pour les plates-formes, comme je souhaite que la plateforme type soit constituée d'une image carrée de taille fixe, je défini un nouveau type de sprite, ''Square'' au lieu de ''Rectangle'', dont je ne spécifie pas la taille la taille est fixée dans ''imageloader'' (choix discutable).+On se rend compte qu'on n'a plus tellement besoin de disposer de sprites de natures différentes. Ceci suffit :
  
 <code python> <code python>
-square.py+fixe.py
  
 import pygame import pygame
-import imageloader+import image
  
-class Square(pygame.sprite.Sprite):+class Fixe(pygame.sprite.Sprite):
     def __init__(self, x, y, png_name:str):     def __init__(self, x, y, png_name:str):
         """         """
Ligne 121: Ligne 85:
  
         super().__init__()         super().__init__()
-        self.image = imageloader.load(png_name)+        self.image = image.load(png_name)
         self.rect = self.image.get_rect()         self.rect = self.image.get_rect()
         self.x = x         self.x = x
Ligne 130: Ligne 94:
         Ajuste la position de l'objet en accord avec la caméra         Ajuste la position de l'objet en accord avec la caméra
         """         """
-        self.rect.left = self.x - camera.x +        self.rect.centerx = self.x - camera.x 
-        self.rect.top = self.y - camera.y+        self.rect.centery = self.y - camera.y
 </code> </code>
  
-Enfin, ''levelreader.py'' s'en trouve un peu changé :+Qu'est-ce qui fait qu'un objet ''Fixe'' est une plate-forme ou autre chose ? 
 + 
 +C'est le fait d'ajouter l'objet dans la groupe ''plateformes'' car c'est ce groupe qui est utilisé dans la détection de collision avec le joueur dans la méthode ''%%update_position%%'' de ''Player''. 
 + 
 +Remarquez que je fais le choix (dans ''adjust'') de positionner l'objet par rapport à son centre ce qui sera mieux pour la plupart des objets comme les pièces. 
 + 
 +===== Et les Coins ===== 
 + 
 +Une pièce est un objet fixe mais avec un attribut ''valeur''. Est-ce que ça vaut la peine de prévoir une classe rien que pour ça ? 
 + 
 +Pas vraiment. On pourrait créer un ''Coin'' en tant qu'objet fixe puis attribuer l'attribut ''valeur''
 + 
 +===== level.py ===== 
 + 
 +Les considérations précédentes nous amènent au changement :
  
 <code python> <code python>
-levelreader.py+level.py
  
 import pygame import pygame
-from square import Square +from fixe import Fixe
-from coin import Coin+
  
 ... ...
  
             if car == 'P':             if car == 'P':
-                s = Square(x*SIZE, y*SIZE, 'upcenter')+                s = Fixe(x, y, 'upcenter')
                 plateformes.add(s)                 plateformes.add(s)
 +            elif car == 'D':
 +                s = Fixe(x, y, 'dollar')
 +                s.valeur = 20
 +                coins.add(s)
  
 ... ...
Ligne 154: Ligne 135:
 Vous avez vu que j'ai prévu des images ''upleft'' et ''upright'' représentant des bords gauche ou droit de plates-formes. On pourrait modifier ''levelreader.py'' pour que, détectant les bords gauche ou droit de plates-formes, il emploie l'image adaptée parmi ''upleft'', ''upcenter'', ''upright''. Vous avez vu que j'ai prévu des images ''upleft'' et ''upright'' représentant des bords gauche ou droit de plates-formes. On pourrait modifier ''levelreader.py'' pour que, détectant les bords gauche ou droit de plates-formes, il emploie l'image adaptée parmi ''upleft'', ''upcenter'', ''upright''.
  
 +En ayant fait ces choix, on peut jeter les modules ''coin.py'' et ''rectangle.py'', ils ne serviront plus.
 +
 +===== data =====
 +
 +On commence à avoir des données éparpillées. Par exemple, il est écrit dans ''plateforme.py'' qu'un bout de plate-forme a la taille 30x30. Il est écrit aussi dans ''level.py'' que la case de base a un côté ''SIZE = 30''.
 +
 +La même info est donc stockée à deux endroits différents ce qui peut rendre le programme difficile à maintenir.
  
 +On pourra alors écrite un module ''data.py'' qui sera importé un peu partout et qui aura pour but de définir toutes les données utiles comme ''SIZE'' ou ''IMAGES''.
  
nsi/tds/pygame/plateforme/image_loader.1679173434.txt.gz · Dernière modification : de goupillwiki