Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pygame - SpaceBall

Un exercice pour débutant

Sujet résolu
    30 novembre 2010 à 16:13:16

    Salut Les zéros! :p

    Je viens vous proposer un petit exercice "SpaceBall" niveau débutant inspiré de mes lectures sur le site pygame.
    Pour faire cet exercice il faut avoir lu les deux premières parties du tutoriel sur python de 6pr1 et prolixe.
    Il faut également avoir lu les deux premiers chapitres du tutoriel sur pygame de clemms.
    C'est fait? Alors on va pouvoir s'y mettre!! :pirate:

    But de l'exercice:

    Le but de cet exercice tout simple est d'obtenir le déplacement aléatoire d'une planète dans un plan (une fenêtre).
    Et, ensuite, euh... Bah c'est tout! (Exercice de débutant je vous ai dit!! :p )

    Déroulement du programme:

    Une fenêtre doit s'ouvrir au lancement du programme avec un fond representant l'espace.
    A l'ouverture de la fenêtre la planète doit se déplacer automatiquement.
    Dès que la planète touche le bord de la fenêtre, hop, elle rebondie sur le bord et repart en sens inverse.

    Comme je suis très sympa :p , je vous donne conne cette magnifique image de la galaxie Andromède (au format 640x480):

    Image utilisateur

    Téléchargez-là, ce sera notre fond! :)

    Et puis tant qu'on y est, je vous donne aussi l'image d'une belle planète bleue. :p

    Terre

    Téléchargez-là aussi ce sera notre Space Ball!! :)

    Bien, vous avez tout ce qu'il faut pour faire cet exercice!

    Un peu d'aide?

    Eh oui, je sais ce que c'est de vouloir faire un exercice mais de pas savoir comment s'y prendre!!
    On a souvent besoin d'un petit coup de pied au... d'avoir le pied à l'étrier, pour pouvoir s'en sortir! ;)
    Je suis passé par là (d'ailleurs j'y suis encore pour certaines approches de python :p )

    Bon, tout d'abord il faut générer la fenêtre (à la bonne taille), charger l'image de notre galaxie et la coller comme fond.
    Ensuite il faut charger notre planète, et récupérer son rect.

    Ensuite on peut passer à notre boucle "while 1":
    On récupère les évènements de type "QUIT" pour fermer la fenêtre si besoin.

    A ce stade, on peut commencer à s'occuper des mouvement de notre planète. :)
    On va pour cela utiliser move qui prends les coordonnées de déplacement de notre rect en paramètre
    On va donc avoir quelque chose du style planete.move(x,y)
    x et y correspondent aux déplacement sur l'axe X et l'axe Y. Ces variables doivent donc etre initialisées avant la boucle while.
    Sauf que si on s'arrête là, notre space ball va sortir de la fenêtre!! Bah oui, on dit:

    tant que 1:
    Bouge la planète de (1,3) ((1,3) c'est un exemple hein)

    Mais on n'a pas spécifié de limite!! Donc notre planète va se déplacer de x=1 et y=3 indéfiniment!! Elle va rapidement sortir de la fenêtre!! Bon ils vous restera la galaxie d'Andromede à contempler mais c'est pas ça qu'on veut!! o_O

    On doit donc ici incorporer une condition:

    1ere condition:
    Si le bord gauche de notre rect est < à ...

    0!! Et oui, n'oubliez pas que une Surface avec pygame ça fonctionne avec des coordoonées. Les coordoonées du point tou en haut à gauche sont (0,0).

    ou

    2eme condition:
    Si le bord droit de notre rect est > à ... (allez un petit effort!)
    la largeur max de notre surface: 640!!

    Alors

    On inverse la le déplacement sur x.

    Il ne vous reste plus qu'à faire la même chose pour l'axe des y et c'est quasi fini!

    N'oubliez pas de coller votre image galaxie sur la fenêtre,
    et de coller votre planète sur les nouvelles coordonnées de son déplacement
    Une petit rafraichissement d'image et hop c'est tout bon!! :)

    Et voilà une belle planète terre qui rebondie partout dans la galaxie!!! :p



    Si il y en a parmi vous qui veulent modifier ou améliorer l'exercice ( générer d'autres contraintes etc.) et proposer leur code pour les autres Zéros ils sont les bienvenus!

    J'espère que, comme moi, vous aurez pris plaisir à faire ce petit exercice! ^^

    (Je mettrai mon code en correction un peu plus tard.)

    Bon python à tous les Zéros!! Postez vos codes!! ^^

    PS: Je proposerai bien ce code dans le billet "exercices python" du forum, mais je ne sais pas si il faut un accord des modérateurs et/ou des admins du site, don en attendant, j'ouvre ce topic.
    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2010 à 17:45:02

      l'image de la terre n'est pas idéalement cropée, faudrait enlever 4 pix à droite et 1 en bas ^^
      le code ci-dessous en tiend compte
      astuce:
      ce code fonctionnne parce que l'image totale de la terre dépasse de 1 pix le dessin de la terre et que le déplacement est de 1 pix aussi, ce qui fait qu'il n'y a pas de trainée même si l'on n'update que l'image de la terre.


      from pygame import *
      
      space = image.load('space.jpg') # chargement de l'image de l'espace
      space_rect = space.get_rect()   # rectangle de l'image de l'espace
      
      earth = image.load('earth.png') # chargement de l'image de la terre
      earth_rect = earth.get_rect()   # rectangle de l'image de la terre
      earth_rect.w = earth_rect.w - 4 # pour rattraper le crop trop large
      earth_rect.h = earth_rect.h - 1 # pour rattraper le crop en hauteur
      
      screen = display.set_mode(space_rect.size) # surface de rendu a la taille de l'image de l'espace
      display.update(screen.blit(space,(0,0)))   # affichage de l'image de l'espace
      
      earth_rect.center = space_rect.center      # on place la terre au centre de la fenetre
      
      ticks = time.Clock() # tempo
      vx,vy = 1,1          # verteurs de deplacement de la terre
      
      while not event.peek(QUIT): # tant qu'on quitte pas
          event.clear()           # on evite de saturer la file d'evenements
                                  # on efface l'image de terre en affichant a la place le bout d'espace correspondant
          screen.blit(space,earth_rect,earth_rect)
                                  # si la terre VA sortir du cadre on change de direction
          if not space_rect.contains(earth_rect.inflate(-2,-2).move(vx,0)): vx = -vx
          if not space_rect.contains(earth_rect.inflate(-2,-2).move(0,vy)): vy = -vy
                                  # on deplace la terre
          earth_rect.move_ip((vx,vy))
                                  # on affiche la terre a sa nouvelle position
          display.update(screen.blit(earth,earth_rect))
          ticks.tick(80)          # tempo
      

      • Partager sur Facebook
      • Partager sur Twitter

      "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

        30 novembre 2010 à 20:40:18

        Salut josmiley! :)
        Je n'ai pas bien compris à quoi tu a pu voir que l'image de la terre n'était pas bien "croppé" o_O

        Je suis un débutant en pygame :p , va falloir que tu m'explique deux, trois trucs dans ton code ^^

        earth_rect.w = earth_rect.w - 4
        


        Le ".w" est-elle une fonction propre eu rect? N'importe quel rect peut avoir cette fonction ".w" qui spécifiera donc systématiquement la largeur du rect?

        screen = display.set_mode(space_rect.size)
        


        Même question pour le ".size" :p . Est-ce aussi une fonction propre au rect?

        if not space_rect.contains(earth_rect.move(vx,0)): vx = -vx
        


        Et euh même question pour ".contains" en fait! :-°
        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2010 à 21:29:56

          earth_rect est un objet Rect et w est un de ses attributs magiques.
          les differents attributs d'un Rect( que j'appel magiques parce que je n'ai pas encore trouvé comment réaliser la même chose en python) sont:
          x, y, top, left, bottom, right, topleft, bottomleft, topright, bottomright, midtop, midleft, midbottom, midright, center, centerx, centery, size, width, height, w et h.

          Citation : pygame.org

          Rect.contains(Rect): return bool
          Returns true when the argument is completely inside the Rect.



          bon, c'est vrai que j'ai un peu compliqué le code ... :p
          • Partager sur Facebook
          • Partager sur Twitter

          "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

            30 novembre 2010 à 22:00:35

            Citation : josmiley

            earth_rect est un objet Rect et w est un de ses attributs magiques.
            les differents attributs d'un Rect( que j'appel magiques parce que je n'ai pas encore trouvé comment réaliser la même chose en python)...



            Comme ça :

            class Rectangle(object):
                def __init__(self, x, y, w, h):
                    self.x = x
                    self.y = y
                    self.w = w
                    self.h = h
            
                @property
                def size(self):
                    return (self.w, self.h)
                
                @size.setter
                def size(self, val):
                    self.w, self.h = val
            
                @property
                def center(self):
                    return (self.x + self.w//2, self.y + self.h//2)
            


            >>> r = Rectangle(0, 0, 10, 10)
            >>> r.w
            10
            >>> r.h
            10
            >>> r.size
            (10, 10)
            >>> r.center
            (5, 5)
            >>> r.size = (16, 10)
            >>> r.w
            16
            >>> r.h
            10
            >>> r.center
            (8, 5)
            


            Plus d'info ici. ;)

            Edit : exemple plus réaliste et explicite.
            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              30 novembre 2010 à 22:10:13

              @ NoHaR :

              ça, ça va me changer ma vie de codeur ;) même si je pige pas les décorateurs.
              merci beaucoup.
              • Partager sur Facebook
              • Partager sur Twitter

              "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                30 novembre 2010 à 22:12:07

                Citation : josmiley

                @ NoHaR :

                ça, ça va me changer ma vie de codeur ;) même si je pige pas les décorateurs.
                merci beaucoup.



                De rien. ;)
                Ça tombe bien, mon tuto sur la décoration a été publié hier. :D

                Edit: bon ok, désolé, je me suis fait un peu de pub. Pour arrêter le HS, je pense que je vais proposer une solution demain si j'ai le temps de m'en occuper, promis. :p
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  1 décembre 2010 à 9:15:51

                  plus simplement ...
                  from pygame import *
                  
                  space = image.load('space.jpg') # chargement de l'image de l'espace
                  space_rect = space.get_rect()   # rectangle de l'image de l'espace
                  
                  earth = image.load('earth.png') # chargement de l'image de la terre
                  earth_rect = earth.get_rect()   # rectangle de l'image de la terre
                  earth_rect.w = earth_rect.w - 4 # pour rattraper le crop trop large
                  earth_rect.h = earth_rect.h - 1 # pour rattraper le crop en hauteur
                  
                  screen = display.set_mode(space_rect.size) # surface de rendu a la taille de l'image de l'espace
                  display.update(screen.blit(space,(0,0)))   # affichage de l'image de l'espace
                  
                  earth_rect.center = space_rect.center      # on place la terre au centre de la fenetre
                  
                  ticks = time.Clock() # tempo
                  vx,vy = 1,1          # verteurs de deplacement de la terre
                  
                  while not event.peek(QUIT): # tant qu'on quitte pas
                      event.clear()           # on evite de saturer la file d'evenements
                                              # on efface l'image de terre en affichant a la place le bout d'espace correspondant
                      screen.blit(space,earth_rect,earth_rect)
                                              # si la terre sort du cadre on change de direction
                      if earth_rect.left < space_rect.left or earth_rect.right > space_rect.right: vx = -vx
                      if earth_rect.top < space_rect.top or earth_rect.bottom > space_rect.bottom: vy = -vy
                                              # on deplace la terre
                      earth_rect.move_ip((vx,vy))
                                              # on affiche la terre a sa nouvelle position
                      display.update(screen.blit(earth,earth_rect))
                      ticks.tick(80)          # tempo
                  
                  • Partager sur Facebook
                  • Partager sur Twitter

                  "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                    1 décembre 2010 à 9:53:30

                    Salut.
                    Bon je n'ai pas le temps de faire mon code ce matin (vu que josmiley a proposé la version "simple", je pense que je vais en faire une orientée objet, héritant de DirtySprite...), mais j'en ai quand même profité pour retoucher un peu l'image de la Terre avec Gimp, et faire en sorte qu'elle soit correctement centrée (et un tout petit peu moins floue) :

                    Image utilisateur

                    J'éditerai pour poster mon code.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      1 décembre 2010 à 9:58:58

                      Ok, je crois que j'ai pigé les attributs "magiques"! :p
                      Entre les explications josmiley et NoHar, je m'y retrouve.
                      D'alleurs je vais aller jeter un coup d'oeil au tuto de NoHar. :)

                      Par contre je n'ai toujours pas compris comment tu a pu voir le mauvais crop de l'image terre. T'as grossi l'aimage 2000000 fois? :-°
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 décembre 2010 à 10:02:09

                        Citation : Fort en pommes


                        D'alleurs je vais aller jeter un coup d'oeil au tuto de NoHar. :)



                        Attention il demande quand même une certaine pratique de la POO en Python, hein. ;)

                        Citation : Fort en pommes


                        Par contre je n'ai toujours pas compris comment tu a pu voir le mauvais crop de l'image terre. T'as grossi l'aimage 2000000 fois? :-°



                        Non, ça se voit à l'œil nu quand tu affiches le fond transparent de l'image, il y a environ 4 pixels de bord en trop à droite et un en bas.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          1 décembre 2010 à 10:53:34

                          Citation : NoHar

                          Attention il demande quand même une certaine pratique de la POO en Python, hein. ;)



                          J'imagine bien, mais bon, par curiosité, et puis j'aime bien apprendre des trucs moi :p

                          Je mets mon code comme correction. J'ai essayé d'être le plus raccord possible avec le cours de clemms sur pygame.

                          J'ai integré le time.Clock() que joesmiley à montré dans son code (pratique pour contrôler les déplacements, je ne connaissais pas).

                          J'ai aussi volontairement fait un code "basique" pour qu'il soit facilement compréhensible par les débutant en python/pygame. ^^

                          Donc ce code n'est certainement pas optimisé mais j'ai envie de dire, c'est fait exprès! :p

                          Allez, zou! La correction:


                          #!usr/bin/env/python
                          # -*- coding:utf-8 -*-
                          
                          import pygame
                          from pygame import *
                          
                          pygame.init() # Initalisation des modules de pygame
                          
                          hauteur=480
                          largeur=640
                          taille=(largeur,hauteur) # On stocke les dimensiosn de la fenêtre dans un tuple
                          
                          Fenetre=pygame.display.set_mode(taille) # On affiche la fenêtre
                          
                          Fond=pygame.image.load("galaxy_640_480.jpg").convert() # on charge l'image de la galaxie
                          
                          Terre = pygame.image.load("earth.png") # On charge l'image de la planète
                          TerreRect = Terre.get_rect()
                          
                          
                          deplacement_terre_x=1 # On définit une coordoonée de déplacement sur l'axe des x
                          deplacement_terre_y=1 # On définit une coordoonée de déplacement sur l'axe des y
                          
                          
                          horloge=pygame.time.Clock() # On charge un objet Clock pour pouvoir ensuite controler le déplacement da planète
                          
                          
                          continuer=1
                          
                          while continuer: # Boucle infinie
                          	for event in pygame.event.get(): # On gère les évènement de type QUIT pour fermer la fenêtre
                          		if event.type==QUIT:
                          			continuer=0
                          			
                          	TerreRect = TerreRect.move(deplacement_terre_x,deplacement_terre_y) # On déplace la terre des coordonnées x et y définis à la ligne 21-22
                          	
                          	if TerreRect.left < 0 or TerreRect.right > largeur: # Si les côtés du rect de la planète sortent des dimensions de la fenêtre
                          		deplacement_terre_x= -deplacement_terre_x # Oniverse le déplacement sur x
                          	if TerreRect.top < 0 or TerreRect.bottom > hauteur: # Si les côtés du rect de la planète sortent des dimensions de la fenêtre
                          		deplacement_terre_y= -deplacement_terre_y # Oniverse le déplacement sur y
                          		
                          	horloge.tick(90) # On limite le déplacement de la terre à 90 frames apr secondes
                          	
                          	Fenetre.blit(Fond,(0,0)) # Les raffraîchissements d'usage...
                          	Fenetre.blit(Terre,TerreRect)
                          	pygame.display.flip()
                          


                          EDIT: Je suis étonné que la partie "exercice" du forum python soit si peu etoffée...
                          Vu le nombre de zéros sur le forum qui assure en python, c'est un peu dommage...
                          Moi qui ne suis pas un pro de python, ni un informaticien :-° , je trouve que l'une des premières difficulté que l'on rencontre après avoir lu un (des) cours sur python, c'est de trouver des exercices ou des thèmes d'exercices pour progresser et s'améliorer.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 décembre 2010 à 11:44:29

                            une petite modif sympa avec l'image de NoHar ...

                            from pygame import *
                            
                            space = image.load('space.jpg')
                            space_rect = space.get_rect()
                            
                            earth = image.load('earth.png')
                            earth_rect = earth.get_rect()
                            
                            screen = display.set_mode(space_rect.size)
                            display.update(screen.blit(space,(0,0)))
                            
                            earth_rect.midbottom = space_rect.midbottom
                            
                            ticks = time.Clock()
                            
                            px,py = earth_rect.topleft
                            vx,vy = 1,-3
                            g = 0.02
                            
                            while not event.peek(QUIT):
                                event.clear()
                                erase = screen.blit(space,earth_rect,earth_rect)
                                if px < space_rect.left or px+earth_rect.w > space_rect.right: vx = -vx
                                if py < space_rect.top or py+earth_rect.h > space_rect.bottom: vy = -vy+g
                                px += vx
                                py += vy  
                                vy += g 
                                earth_rect.topleft = px,py
                                display.update((erase,screen.blit(earth,earth_rect)))
                                ticks.tick(120)
                            
                            • Partager sur Facebook
                            • Partager sur Twitter

                            "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                              1 décembre 2010 à 14:01:34

                              Citation : fortenpommes

                              Je suis étonné que la partie "exercice" du forum python soit si peu etoffée...
                              Vu le nombre de zéros sur le forum qui assure en python, c'est un peu dommage...
                              Moi qui ne suis pas un pro de python, ni un informaticien :-° , je trouve que l'une des premières difficulté que l'on rencontre après avoir lu un (des) cours sur python, c'est de trouver des exercices ou des thèmes d'exercices pour progresser et s'améliorer.



                              C'est dû à la jeunesse du forum, je pense.
                              On a de la chance parce qu'on s'est organisés pour faire des sujets d'exos sympas dès le départ, mais le problème reste que le forum étant jeune, et les volontaires pour créer les sujets étant aussi occupés (je suis passé modo entre temps... je passe donc beaucoup moins de temps sur le forum Python qu'avant, puisque c'est l'un des plus propres, ce qui me laisse moins de temps pour créer des exos ou des mini-projets...), il est vrai que ça peut manquer un peu de dynamisme. Mais c'est grâce à des initiatives comme la tienne sur ce topic que l'on peut arranger ça. ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                1 décembre 2010 à 14:45:27

                                Oui effectivement si le forum est relativement jeune ça peut expliquer qu'il n'y ai pas beaucoup d'exercices proposés. Je me souviens avoir posé la question d'un forum python, à l'époque où il n'y avait pas de forum python . ^^

                                Le problème pour des gens comme moi qui ne sommes pas des brutes en programmation, c'est qu'il est difficile d'évaluer la pertinence d'un exercice que l'on pense proposer, mais bon qui ne tente tien n'a rien en même temps. :p

                                Est-ce qu'on peut proposer l'exo SpaceBall dans la partie "exercices" du forum?

                                @joesmiley: Marrant le coup de la planète qui rebondit, je vais essayer de comprendre ton code pour m'y retrouver. :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 décembre 2010 à 14:49:57

                                  Oui tu peux tout à fait, il suffit de poster dans le post-it pour demander à être référencé.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    1 décembre 2010 à 19:24:16

                                    Salut,:)
                                    Voilà une version utilisant un Sprite

                                    #!/usr/bin/env python
                                    #coding: utf8
                                    
                                    import pygame
                                    
                                    class Terre(pygame.sprite.Sprite):
                                        """Classe héritière de Sprite"""
                                        def __init__(self, surface, size):
                                            pygame.sprite.Sprite.__init__(self)  # init de la classe parent
                                            # image et rect sont des attributs de Sprite
                                            self.image = surface
                                            self.rect = surface.get_rect()
                                    
                                            self.size = size                     # un tuple des dimensions
                                            self.vector = [1, 1]                 # la vitesse [x, y]
                                    
                                        def deplacement(self):
                                            # On déplace la terre sur x et y
                                            self.rect.x += self.vector[0];self.rect.y += self.vector[1]
                                            # On vérifie s'il y a collision avec le bord de l'écran
                                            # si oui on inverse les valeurs
                                            if self.rect.right >= self.size[0] or self.rect.left <= 0:
                                                self.vector[0] = -self.vector[0]
                                            if self.rect.bottom >= self.size[1] or self.rect.top <= 0:
                                                self.vector[1] = -self.vector[1]
                                    
                                        def update(self):
                                            self.deplacement()
                                    
                                    
                                    
                                    if __name__ == "__main__":
                                    
                                        pygame.init()
                                        size = (640, 480)
                                        screen = pygame.display.set_mode(size)
                                    
                                        background = pygame.image.load("bg.jpg").convert()
                                        surface_terre = pygame.image.load("terre.png").convert_alpha()
                                    
                                        terre = Terre(surface_terre, size)  # Création de l'objet Terre
                                        sprites_terre = pygame.sprite.RenderUpdates((terre)) # Création d'un RenderUpdate qui prend comme paramètre notre objet Terre
                                    
                                        run = True
                                        fps = pygame.time.Clock()
                                    
                                        while run:
                                    
                                            fps.tick(90)
                                    
                                            event = pygame.event.poll()
                                    
                                            if event.type == pygame.QUIT:
                                                run = False
                                    
                                            screen.blit(background, background.get_rect())
                                    
                                            sprites_terre.update()          # On met à jour notre Sprite
                                            sprites_terre.draw(screen)      # On le dessine sur l'écran
                                    
                                            pygame.display.flip()
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 décembre 2010 à 19:34:10

                                      Argh, j'me suis encore fait couper l'herbe sous le pied (le badge bleu, c'est comme la kryptonite)...

                                      Bon, dans ce cas je propose une évolution intéressante qui peut être aussi très formatrice :

                                      Pourquoi ne pas rajouter une ou deux planètes (mettons Mars et Jupiter), et essayer de gérer les collisions entre elles ? :p

                                      Comme ce sont des objets ronds, ça peut être intéressant de réfléchir au meilleur rapport simplicité/fidélité du résultat...

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                        2 décembre 2010 à 2:49:00

                                        Citation : NoHaR

                                        Argh, j'me suis encore fait couper l'herbe sous le pied (le badge bleu, c'est comme la kryptonite)...



                                        Oups.... ma faute, je n'ai fait que survoler les posts sans vraiment lire :S

                                        Citation : NoHaR

                                        je pense que je vais en faire une orientée objet, héritant de DirtySprite...



                                        Sinon (n'aillant, pour l'instant, encore jamais utilisé de DirtySprite je vais peut-être dire une connerie mais bon) cela pourrait être intéressant de voir les différences d'utilisation entre un Sprite et un DirtySprite sur cette exo, si toutefois il y en a ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          2 décembre 2010 à 10:19:14

                                          Huhu, il progresse cet exercice! :p

                                          Merci pour ce code F@rhen ^^ , mais je suis un peu largué!! o_O

                                          Je débute dans la création et l'utilisation des classes, je vais essayer de piger un peu ton code malgré tout. :)

                                          Par contre je me disais que si on propose un petit exercice comme celui-là sur le post-it "exercice du forum", je le verrai bien dans un style progressif, afin que les bons gros Zéros (comme moi :p ) s'y retrouvent. Avec des parties liées mais découpées pour que la compréhension et l'apprentissage soient relativement aisées. Genre:

                                          1/ Générer le script de base permettant le déplacement de la SPaceBall dans une fenêtre
                                          2/ Rajouter une ou deux contraintes dans le style de ce qu'a proposé joesmiley avec une variable accélération qui augment sur l'axe des y
                                          3/ Générer une classe pour commencer à coder un peu objet
                                          4/ Comme le propose NoHar, gérer les collisions etc

                                          Bon si mon idée est pourrie vous avez le droit de me le dire hein! :-°
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 décembre 2010 à 15:12:12

                                            Salut les Zéros! :p

                                            Bon F@rhen je me suis saigné quelques jours sur ton code mais c'est un peu trop hardu pour moi, pour que je me débrouille tout seul... :euh:

                                            Par contre j'ai essayé de coder cette exercice en créant une petite classe Planete, histoire de coder un peu en POO, mais je ne sais pas trop dans quel ordre m'y prendre.

                                            Je ne sais pas vraiment quoi mettre dans la classe. Par exemple, je ne sais absolument pas quoi mettre dans le constructeur de la classe. J'ai crée une méthode déplacement(), mais je n'arrive pas à l'utiliser correctement... :'(

                                            Je vous mets mon code (qui ne fonctionne pas du tout :p ), histoire que vous voyez l'étendu du désastre:

                                            #!usr/bin/env/python
                                            # -*- coding:utf-8 -*-
                                            
                                            import pygame
                                            from pygame import *
                                            
                                            
                                            class Planete:
                                            		
                                            	def deplacement(self):
                                            		TerreRect = TerreRect.move(deplacement_terre_x,deplacement_terre_y) # On déplace la terre des coordonnées x et y
                                            		if TerreRect.left < 0 or TerreRect.right > largeur: # Si les côtés du rect de la planète sortent des dimensions de la fenêtre
                                            			deplacement_terre_x = -deplacement_terre_x # Oniverse le déplacement sur x
                                            		if TerreRect.top < 0 or TerreRect.bottom > hauteur: # Si les côtés du rect de la planète sortent des dimensions de la fenêtre
                                            			deplacement_terre_y = -deplacement_terre_y # Oniverse le déplacement sur y
                                            
                                            if __name__=="__main__":
                                            	
                                            	pygame.init()
                                            
                                            	hauteur=480
                                            	largeur=640
                                            	taille=(largeur,hauteur)
                                            
                                            	Fenetre=pygame.display.set_mode(taille)
                                            
                                            	Fond=pygame.image.load("galaxy_640_480.jpg").convert()
                                            	
                                            
                                            	Terre = pygame.image.load("earth.png").convert()
                                            	Terre=Terre.get_rect()
                                            
                                            
                                            	deplacement_terre_x=1
                                            	deplacement_terre_y=1
                                            
                                            
                                            	horloge=pygame.time.Clock() 
                                            
                                            
                                            	continuer=1
                                            	
                                            while continuer:
                                            	for event in pygame.event.get(): # On gère les évènement de type QUIT pour fermer la fenêtre
                                            		if event.type==QUIT:
                                            			continuer=0
                                            	
                                            # A partir d'ici je patine complètement...
                                            # Je n'arrive pa à utiliser la classe Planete correctement...
                                            		
                                            	TerreRect = Planete()
                                            	
                                            	horloge.tick(90) # On limite le déplacement de la terre à 90 frames apr secondes
                                            	
                                            	Fenetre.blit(Fond,(0,0)) # Les raffraîchissements d'usage...
                                            	Fenetre.blit(Terre,TerreRect.deplacement())
                                            	pygame.display.flip()
                                            


                                            Du coup ma classe ne contient pas de constructeur...
                                            Un petit coup de main pour m'aider à coder la classe Planete proprement serait le bienvenu! ^^
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 décembre 2010 à 16:58:58

                                              tu peux dériver de la class Rect et __init__() ton objet avec une image ou une surface, une vitesse et une position de départ par exemple ...
                                              class Planet(pygame.Rect):
                                                  ''
                                                  def __init__(self,image,pos,speed):
                                                      self.image = pygame.image.load(image)
                                                      pygame.Rect.__init__(self,self.image.get_rect())
                                                      self.vx,self.vy = speed
                                                      self.pos = pos
                                              
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                                                7 décembre 2010 à 12:50:38

                                                Merci joesmiley! :)

                                                Si j'ai bien compris je crée une classe Planet qui va hériter des attributs et des méthodes de la classe Rect?
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  28 janvier 2011 à 16:32:09

                                                  oué.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                                                  Pygame - SpaceBall

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown