IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Probleme compréhension jeux Labyrinthe (python orienté objet)


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut Probleme compréhension jeux Labyrinthe (python orienté objet)
    Bonjour a toutes et a tous ,
    J'ai pensé que vous pourriez m'aider sur un ou deux points que je ne comprends pas . Je vous donne l'ensemble du code pas trop long , puis je vous pose ma question .
    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    import pygame, random, sys
    from CLASSES import *
    from CONSTANTES import *
     
    def AFFICHER_SCORE():
      font = pygame.font.SysFont('Arial', TUILE_TAILLE - 5)
      background = pygame.Surface((LARGEUR, SCORE_HAUTEUR))
      background = background.convert()
      background.fill(BLANC)
      text = font.render(_personnage.chrono.Timer.strftime("%H:%M:%S"), 1, NOIR)
      textpos = text.get_rect(centerx = LARGEUR / 2, centery = SCORE_HAUTEUR / 2)
      background.blit(text, textpos)
      screen.blit(background, (0, 0))
     
    pygame.init()
     
    screen = pygame.display.set_mode([LARGEUR, HAUTEUR])
    pygame.display.set_caption('Le jeu du labyrinthe')
     
    XX = 0
    YY = 0
    with open("Labyrinthe.txt", "r") as fichier:
      for ligne in fichier:
        for sprite in ligne:
          if sprite == 'M':
            _mur = MUR(XX, YY)
            LISTE_MURS.add(_mur)
            LISTE_GLOBALE_SPRITES.add(_mur)
          XX = XX + 1
        XX = 0
        YY = YY + 1
     
    _personnage = None
    RECHERCHE_PERSONNAGE = True
    while RECHERCHE_PERSONNAGE:
        _personnage = PERSONNAGE()
        LISTE_CONFLIT = pygame.sprite.spritecollide(_personnage, LISTE_MURS, False)
        if len(LISTE_CONFLIT) == 0:
            LISTE_GLOBALE_SPRITES.add(_personnage)
            RECHERCHE_PERSONNAGE = False
     
    while len(LISTE_OBJETS) < 10:
        _objet = OBJET()
        LISTE_CONFLIT = pygame.sprite.spritecollide(_objet, LISTE_GLOBALE_SPRITES, False)
        if len(LISTE_CONFLIT) == 0:
            LISTE_GLOBALE_SPRITES.add(_objet)
            LISTE_OBJETS.add(_objet)
     
    clock = pygame.time.Clock()
     
    print("C'est parti...")
     
    RUN = True
     
    while RUN:
      for event in pygame.event.get():
        if event.type == pygame.QUIT:
          RUN = False
        elif event.type == pygame.KEYDOWN:
          if event.key == pygame.K_LEFT:
            _personnage.DIRECTION = 'G'
            break
          elif event.key == pygame.K_RIGHT:
            _personnage.DIRECTION = 'D'
            break
          elif event.key == pygame.K_UP:
            _personnage.DIRECTION = 'H'
            break
          elif event.key == pygame.K_DOWN:
            _personnage.DIRECTION = 'B'
            break
     
      LISTE_GLOBALE_SPRITES.update()
      screen.fill(BLANC)
     
      LISTE_GLOBALE_SPRITES.draw(screen)
      AFFICHER_SCORE()
     
      if _personnage.TERMINE:
        pygame.time.wait(5000)
        TERMINE = False
     
      pygame.display.flip()
      dt = clock.tick(60)
      _personnage.chrono.update(dt)
     
    print("Nombre d'objets ramassés : %d" % _personnage.POINTS)
    pygame.quit()
    CLASSES.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    import pygame, random, sys
    from CONSTANTES import *
    from datetime import timedelta, datetime, date, time
     
    LISTE_OBJETS = pygame.sprite.Group()
    LISTE_MURS = pygame.sprite.Group()
    LISTE_GLOBALE_SPRITES = pygame.sprite.Group()
     
    class MUR(pygame.sprite.Sprite):
      def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("MUR.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.y = TUILE_TAILLE * y + SCORE_HAUTEUR
        self.rect.x = TUILE_TAILLE * x
     
    class OBJET(pygame.sprite.Sprite):
      def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("OBJET.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.y = random.randint(0, TUILE_NOMBRE - 1) * TUILE_TAILLE + SCORE_HAUTEUR
        self.rect.x = random.randint(0, TUILE_NOMBRE - 1) * TUILE_TAILLE
     
    class PERSONNAGE(pygame.sprite.Sprite):
      def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("PERSONNAGE.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.y = random.randint(0, TUILE_NOMBRE - 1) * TUILE_TAILLE + SCORE_HAUTEUR
        self.rect.x = random.randint(0, TUILE_NOMBRE - 1) * TUILE_TAILLE
        self.POINTS = 0
        self.TERMINE = False
        self.DIRECTION = '-'
        self.chrono = Chrono()
     
      def update(self):
        X_COURANT = self.rect.x
        Y_COURANT = self.rect.y
        if self.DIRECTION == 'G':
          self.rect.x -= TUILE_TAILLE
          self.DIRECTION = '-'
        elif self.DIRECTION == 'D':
          self.rect.x += TUILE_TAILLE
          self.DIRECTION = '-'
        elif self.DIRECTION == 'H':
          self.rect.y -= TUILE_TAILLE
          self.DIRECTION = '-'
        elif self.DIRECTION == 'B':
          self.rect.y += TUILE_TAILLE
          self.DIRECTION = '-'
     
        LISTE_COLLISION_MUR = pygame.sprite.spritecollide(self, LISTE_MURS, False)
        if len(LISTE_COLLISION_MUR) > 0:
            self.rect.x = X_COURANT
            self.rect.y = Y_COURANT
     
        LISTE_COLLISION_OBJET = pygame.sprite.spritecollide(self, LISTE_OBJETS, False)
        for objet in LISTE_COLLISION_OBJET:
          objet.kill()
          self.POINTS += POINT_UNITE
          if self.POINTS == 10:
              self.chrono.stop()
     
    class Chrono:
      def __init__(self):
       self.Timer = datetime.combine(date.today(), time(0, 0))
       self.STOP = False
     
      def stop(self):
          self.STOP = True
     
      def update(self, dt):
          if self.STOP == False:
            self.Timer += timedelta(milliseconds=dt)
    CONSTANTES.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NOIR = (0, 0, 0)
    BLANC = (255, 255, 255)
     
    TUILE_TAILLE = 30
    TUILE_NOMBRE = 25
    SCORE_HAUTEUR = 32
     
    LARGEUR = TUILE_TAILLE * TUILE_NOMBRE
    HAUTEUR = TUILE_TAILLE * TUILE_NOMBRE + SCORE_HAUTEUR
     
    POINT_UNITE = 1
    Question :
    - Dans le fichier main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE_GLOBALE_SPRITES.update()
    Je ne vois qu'une seule methode update , celle contenue dans la classe PERSONNAGE .
    LISTE_GLOBALE_SPRITES a t il le droit d'utiliser la methode " def update(self): " qui se trouve dans la classe PERSONNAGE ?
    Meme si on importe la classe PERSONNAGE dans le main , elle n'appartient qu'a cette classe , non ?
    Ou peut etre utilise t il une methode update contenue dans la classe Sprite ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par chris7522 Voir le message
    Ou peut etre utilise t il une methode update contenue dans la classe Sprite ?
    Avec LISTE_GLOBALE_SPRITES = pygame.sprite.Group(), il faut regarder ce que fait update pour un Group...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Je te remercie de l'aide que tu m'as apporté . Peux tu être plus explicite s'il te plaît .
    Bonne soirée

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Peux tu être plus explicite s'il te plaît.
    Qu'est ce que vous ne comprenez pas dans ce que dit la documentation de pygame.sprite.Group sur la méthode update?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Bonjour,
    Ma question peut paraître stupide , je souhaiterai savoir s'il faut implémenter soi même la méthode update() ou la classe Group aurai une méthode interne update() qui actualiserai automatiquement mon groupe de Sprite.
    Dans le cas présent, dans le main.py , mon groupe de sprite appele une méthode update , est ce celle contenue dans ma classe PERSONNAGE ?
    Je vous remercie.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Ma question peut paraître stupide , je souhaiterai savoir s'il faut implémenter soi même la méthode update() ou la classe Group aurai une méthode interne update() qui actualiserai automatiquement mon groupe de Sprite.
    Si la documentation dit:
    update()
    call the update method on contained Sprites
    update(*args, **kwargs) -> None

    Calls the update() method on all Sprites in the Group. The base Sprite class has an update method that takes any number of arguments and does nothing. The arguments passed to Group.update() will be passed to each Sprite.

    There is no way to get the return value from the Sprite.update() methods.
    faut-il le traduire en français?

    Citation Envoyé par chris7522 Voir le message
    Dans le cas présent, dans le main.py , mon groupe de sprite appele une méthode update , est ce celle contenue dans ma classe PERSONNAGE ?
    De toutes façons, vous ne saurez jamais si vous avez compris ce que raconte une documentation technique sans essayer sur un petit exemple pour voir si çà fait ce que vous avez compris et accessoirement comment l'utiliser dans votre code.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Désolé , je ne souhaitais pas vous déranger .

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Désolé , je ne souhaitais pas vous déranger .
    Vous ne dérangez pas, juste que je ne comprends pas ce que vous voulez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    Oui je comprends , vous ne pouvez pas m'aider si mes questionnements manquent de clarté . Je n'aurai pas fait un bon développeur , c'est certain !
    Merci de votre patience
    Très bon week-end a vous

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    La classe Group founit bien une méthode update(). Pour le savoir, on se réfère à la documentation officielle, comme nous l'indique wiztricks.
    Et ce que nous indique cette doc, c'est que la méthode update() appelle bien la méthode update() des Sprite contenu dans le Group.

    Et si vous voulez de l'aide sur la méthode Sprite.update(), elle a aussi sa documentation : https://www.pygame.org/docs/ref/spri....Sprite.update
    Notamment, la classe Sprite a bel et bien une méthode update(), vide. Lorsque vous héritez de la classe Sprite, libre à vous de redéfinir une méthode update() afin de donner un comportement à votre Sprite (par exemple, un déplacement).

    Autrement dit, la méthode Group.update() appelle la méthode update() des sprites. Lorsque vous avez défini la méthode update() dans vos classe héritant de Sprite, c'est votre méthode qui est appelée, sinon, c'est la méthode Sprite.update() qui est appelée (et qui ne fait rien).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 196
    Points : 37
    Points
    37
    Par défaut
    C'est claire pour moi
    Mille mercis !

    " La méthode uppdate que l'on peut implémenter soi meme dans chacune de nos classes , est une surcharge de la classe mère pygame.sprite.Sprite . Elle sera automatiquement appelée a chaque itération , ainsi , la boucle de jeu n'est pas trop surchargé par une multitude de mise a jour , chaque objet graphique gérant lui-meme sa facon de se mettre a jour "

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/12/2009, 17h37
  2. Python et l'orienté objet
    Par peterphonic dans le forum Général Python
    Réponses: 13
    Dernier message: 14/01/2009, 22h39
  3. Réponses: 3
    Dernier message: 18/04/2007, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo