Partage
  • Partager sur Facebook
  • Partager sur Twitter

[A supprimer]

Sujet résolu
    3 février 2011 à 12:22:26

    Bonjour à tous, voila, j'aimerai faire une casse-brick en pygame mais j'ai un petit problème, je ne sais pas comment faire en sorte que la balle réagise toute seul, ce qui inclut le déplacement de la balle, les collisions avec le mur/ et la barre principale

    Voici le début de mon code:
    import pygame
       from pygame.locals import *
       from random import *
       from math import *
       pygame.init()
       pygame.key.set_repeat(450,10)
       fenetre = pygame.display.set_mode((640,480))
       fond = pygame.image.load("fond_tfe.jpg")
       fenetre.blit(fond, (0,0))
       bp = pygame.image.load("barre_princi.jpg").convert_alpha()
       pbp = bp.get_rect()
       pbp = pbp.move(265,450)
       fenetre.blit(bp, pbp)
       ball = pygame.image.load("ball.png").convert_alpha()
       pball = ball.get_rect()
       pball = pball.move(315,431)
       pygame.display.flip()
       continuer = 1
       x = 0
       k = 250
       while continuer:
    	     for event in pygame.event.get():  
    		    if event.type == QUIT:   
    		        	continuer = 0
    			
    		    if event.type == KEYDOWN: 
    		        	if k > 0 :
    				     if event.key == K_LEFT:
    					    x = x - 10
    				            pbp = pbp.move(x,0)
    					    x = 0
    					    k = k - 10
    			        if  k < 500 :
    				     if event.key == K_RIGHT:
    					    x = x + 10
    					    pbp = pbp.move(x,0)
    					    x = 0
    					    k = k + 10
    	     fenetre.blit(fond, (0,0))	
    	     fenetre.blit(bp, pbp)
    	     fenetre.blit(ball,pball)
    	     pygame.display.flip()
    





    J'ai trouvé tout ceci via ce site même mais j'ai beau cherché sur Google, je ne trouve pas (enfin si mais avec des def/class et ce n'est pas vraiment mon fort =p)

    Merci à vous
    Cordialement Drevils
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2011 à 13:42:14

      salut,
      même si le principe est simple, vouloir coder un casse-brique sans connaitre la POO ça va être chaud; faisable mais chaud ...

      je commencerai plutôt par toucher à la POO en créant une class Barre qui réagisse avec les events clavier; histoire de m'exercer avec les class ...
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        3 février 2011 à 15:14:42

        Salut,

        Moi je commencerai pas mettre mon code dans les balises prévues à cet effet, ce sera tout de suite plus simple pour les Zéros de te relire et donc de pouvoir t'aider. :)
        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2011 à 8:06:43

          Citation : drevils


          J'ai trouvé tout ceci via ce site même mais j'ai beau cherché sur Google, je ne trouve pas (enfin si mais avec des def/class et ce n'est pas vraiment mon fort =p)



          Salut.

          Bon d'abord, je suis obligé de faire mon flic :
          Les balises code SCRONGNONGNON ! C'pas que pour les lamas !

          Il suffit d'encadrer ton code dans ton premier post avec :
          <code type="python">
             … ton code ici …
          </code>
          


          Merci d'éditer ton premier post pour y remédier au plus vite.

          Bien, maintenant que ça c'est posé… Je rejoins l'avis des autres : si tu ne sais pas encore programmer « avec des def/class », il est encore trop tôt pour te lancer dans un casse-brique. Savoir organiser son code en fonctions et en classes est indispensable pour ne pas s'y perdre. Je t'encourage donc à suivre plus en profondeur le tutoriel Python de ce site avant de passer à ce genre de petits projets (en soi, c'est un jeu très simple à coder, mais seulement une fois les bases acquises).
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            4 février 2011 à 8:47:46

            Je sais programmer avec les def/class c'est juste que je ne suis pas spécialement à l'aise avec celà =)

            ps: j'ai édit
            • Partager sur Facebook
            • Partager sur Twitter
              4 février 2011 à 11:25:40

              Citation : drevils

              Je sais programmer avec les def/class c'est juste que je ne suis pas spécialement à l'aise avec celà =)



              ben c'est le moment de s'y mettre alors ^^
              une structure de ce type serait pas mal je pense ...

              class palet
                  update:
                      déplacer en fonction des events clavier
              
              class balle
                  update:
                      avancer
                      si touche objet => rebond
                      si objet touché == brick ==> supprimer brick
              
              class brick
              
              mainloop:
                  palet.update
                  balle.update
                  si balle sort du cadre etc ...
                  etc ...
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                5 février 2011 à 15:20:38

                Plop.

                @drevils : ce qu'on essaye de t'expliquer, c'est qu'un jeu n'est pas juste un script. Le fait de programmer « avec des def/class », comme tu dis, est d'une importance capitale puisque sans ça, ton code n'est pas organisé, pas modulaire (pas facile à modifier/faire évoluer/corriger), et tout simplement pas conçu.

                Il faut bien différentier le fait d'utiliser Python pour faire des petits scripts utilitaires d'un côté (un script étant par définition officieuse un bout de programme codé de manière rapide et sale pour effectuer une même opération complexe un nombre indéterminé de fois), et le fait de créer de vrais programmes avec, qui demandent une phase de conception et une bonne dose d'organisation. Ton casse-brique rentre dans la seconde catégorie, et ce n'est pas juste pour t'emmerder que l'on te dit de t'y coller en créant des fonctions et/ou des classes : c'est juste indispensable.

                Par ailleurs, je pense qu'il serait bon de créer un topic d'exercice/miniprojet sur le casse-brique, en détaillant bien les diverses étapes de la création du jeu, (en insistant sur l'aspect orienté objet, autant que possible, comme je me souviens de l'avoir fait pour le démineur). Ça aiderait en premier lieu l'ami drevils, mais aussi un bon nombre de débutants (on a déjà une série de sujets d'exos qui sont des jeux avec pygame, m'enfin le casse-brique est un sujet assez simple, et tellement "classique", que ce serait dommage de s'en passer ;) ).

                Là aujourd'hui je n'ai pas beaucoup de temps, mais si j'arrive à me débloquer une heure ou deux ce soir, je le ferai (si personne ne s'est porté volontaire d'ici là — bizoo josmiley :) —).
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  5 février 2011 à 23:23:00

                  héhé,
                  mais j'ai trop de boulot en ce moment ... :(
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    6 février 2011 à 0:22:47

                    C'est une bonne idée!
                    Mais je me la réserve pour le forum C :D .

                    @Nohar:un casse brique c'est loin d'être très simple si tu veux faire un truc correct.;)

                    edit:
                    mais, tu auras au moins un participant.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      6 février 2011 à 0:31:53

                      Citation : GurneyH


                      @Nohar:un casse brique c'est loin d'être très simple si tu veux faire un truc correct.;)



                      Perso, seuls deux points me paraissent « sensibles » (pas compliqués, mais à réfléchir) :
                      - modifier la trajectoire de la balle en fonction de l'abscisse du point de collision entre la balle et le palet, par rapport au centre du palet ;
                      - gérer les collisions intelligemment. S'il y a 50 briques et une seule balle, il n'est pas utile de tester les collisions entre la balle et toutes les briques à la fois.

                      À partir de là, il est possible d'avoir un casse-brique à peu près agréable à jouer. Bien sûr, après, si on veut rendre le jeu intéressant, il faut créer un level-editor, des briques de types différents, des bonus/malus, des animations, etc. mais le principe de base reste très simple.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        6 février 2011 à 0:42:07

                        Hum, la collision balle-brique je t'assure qu'un débutant ne la fera pas. ;)

                        J'ai testé le sujet il y a peu, c'est loin d'être simple(facile).

                        Après la collision balle raquette c'est 2 objets en mouvement.
                        C'est aussi un "léger" problème.

                        Mais dans tous les cas, je comptais proposer ça sur le forum C(style Josmiley).
                        Mais en python, ça va rester un bon exercice pour moi. :)

                        Citation : Nohar


                        - modifier la trajectoire de la balle en fonction de l'abscisse du point de collision entre la balle et le palet, par rapport au centre du palet ;


                        Ca c'est facile, je pense...

                        La vraie difficulté c'est bien la collision balle-brique(si on ne veut pas gérer des tonnes d'exceptions)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Zeste de Savoir, le site qui en a dans le citron !
                          6 février 2011 à 11:04:07

                          ouep, pas facile le casse-brique.
                          le point dur c'est lifter la balle avec le palet, pour ma part j'en ai chi*.

                          j'en ai pondu un il y a quelques temps (le code est très môche)
                          http://www.pygame.org/project-arnakoid-1553-2742.html
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Python c'est bon, mangez-en. 

                            6 février 2011 à 11:24:23

                            Je ne le prend absolument pas mal =) Je suis dans une école d'informatique en secondaire et pour notre TFE nous devons pouvoir faire un programme, comme un casse-brick, le jeu pong, donkey-kong quand il lance des tonneaux et que mario doit arriver tout en haut de la map pour sauver la princesse etc et j'ai choisis casse-brick comme sujet, la programmation n'est pas mon fort et j'ai d'abord du rédiger un document avec les divers points à faire pour réaliser mon programme, ainsi que ce qu'il devrait faire et ce qu'il ne devrait pas, un cahier des charges en quelque sorte =)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 février 2011 à 15:27:29

                              juste pour le fun, faut que je fignole la class Balle ...
                              fin de niveau à faire...
                              quelques bugs sont corrigés, have fun ^^
                              from pygame import *
                              from math import sin,cos,radians,degrees,acos
                              
                              level0 = """
                              __________
                              __________
                              1111221111
                              1122332211
                              1100220011
                              """
                              
                              class Locale:
                                  bg_color = (200,200,200)
                                  brick_color = (0,0,255,200),(100,0,0,200),(50,0,0,200),(25,0,0,200),bg_color
                                  brick_size = 30,20
                                  brick_inflate = -2,-2
                                  screen = display.set_mode((brick_size[0]*10,brick_size[1]*15))
                                  screen_rect = screen.get_rect()
                                  palet_size = 60,4
                                  palet_color = (50,50,50)
                                  palet_speed = 6
                                  palet_up = 5
                                  balle_color = (25,25,25)
                                  balle_speed = 6
                                  balle_size = 2,2
                                  shadow_color = 150,150,150
                                  shadow_offset = 2,2
                              
                              #**************************BALLE****************************************
                              class Balle(Rect):
                                  all = []
                                  def __init__(self,x,y):
                                      self.angle = -45
                                      self.X = x
                                      self.Y = y
                                      self.vx = cos(radians(self.angle))
                                      self.vy = sin(radians(self.angle))
                                      Rect.__init__(self,((x,y),Locale.balle_size))
                                      self.laps = Locale.balle_speed
                                      self.t = time.Clock()
                                      self.tt =0
                                      Balle.all.append(self)
                                  
                                  def update(self):
                                      self.tt += self.t.tick()
                                      if self.tt >= self.laps:
                                          
                                          if Rect((self.X+self.vx,self.Y+self.vy),Locale.balle_size).colliderect(*Palet.all):
                                              k = key.get_pressed()
                                              self.angle = degrees(acos(self.vx))
                                              self.angle -= (k[K_RIGHT]-k[K_LEFT])*10
                                              self.vx = cos(radians(self.angle))
                                              self.vy = sin(radians(self.angle))
                                          
                                          f = Rect((self.X+self.vx,self.Y+self.vy),Locale.balle_size)
                                          sp = Brick.all+Palet.all
                                          t = f.collidelist(sp)
                                          if t >= 0:
                                              try: Brick.all[t].update()
                                              except: pass
                                              if Rect((self.X,self.Y+self.vy),Locale.balle_size).colliderect(sp[t]):
                                                  self.vy *= -1
                                              elif Rect((self.X+self.vx,self.Y),Locale.balle_size).colliderect(sp[t]):
                                                  self.vx *= -1
                                              else:
                                                  self.vx *= -1
                                                  self.vy *= -1
                                          elif f.right > Locale.screen_rect.right or f.left < Locale.screen_rect.left:
                                              self.vx *= -1
                                          elif f.top < Locale.screen_rect.top:
                                              self.vy *= -1
                                          else:
                                              self.X += self.vx
                                              self.Y += self.vy
                                              self.topleft = self.X,self.Y
                                          self.tt -= self.laps
                              #***********************************************************************
                              #**************************BRICK****************************************
                              class Brick(Rect):
                                  static_bg = Surface(Locale.screen_rect.size,SRCALPHA)
                                  static_bg.fill((0,0,0,0))
                                  static_shadow = Surface(Locale.screen_rect.size,SRCALPHA)
                                  static_shadow.fill(Locale.bg_color)
                                  w,h = Locale.brick_size
                                  all = []
                                  def __init__(self,x,y,val):
                                      Rect.__init__(self,(x*Brick.w,y*Brick.h,Brick.w,Brick.h))
                                      self.inflate_ip(*Locale.brick_inflate)
                                      self.val = val
                                      Brick.static_shadow.fill(Locale.shadow_color,self.move(*Locale.shadow_offset))
                                      Brick.static_bg.fill(Locale.brick_color[self.val],self)
                                      Brick.all.append(self)
                              
                                  def update(self):
                                      if self.val:
                                          self.val -= 1
                                          if not self.val:
                                              Brick.static_bg.fill((0,0,0,0),self)
                                              Brick.static_shadow.fill(Locale.bg_color,self.move(*Locale.shadow_offset))
                                              Brick.all.remove(self)
                                          else:
                                              Brick.static_bg.fill(Locale.brick_color[self.val],self)
                              #***********************************************************************
                              #**************************PALET****************************************
                              class Palet(Rect):
                                  laps = Locale.palet_speed
                                  all = []
                                  def __init__(self):
                                      Rect.__init__(self,((0,0),Locale.palet_size))
                                      self.midbottom = Locale.screen_rect.midbottom
                                      self.move_ip(0,-Locale.palet_up)
                                      Palet.all.append(self)
                                      self.t = time.Clock()
                                      self.tt =0
                                  
                                  def update(self):
                                      self.tt += self.t.tick()
                                      if self.tt >= Palet.laps:
                                          k = key.get_pressed()
                                          x = (k[K_RIGHT]-k[K_LEFT])
                                          self.x += x
                                          for b in Balle.all:
                                              if self.colliderect(b): b.move_ip(x,0)
                                          self.tt -= Palet.laps
                                      
                              #***********************************************************************
                              
                              def load(level):
                                  for e,i in enumerate(level.replace('\n','')):
                                      if i !='_': Brick(e%10,e/10,int(i))
                              
                              load(level0)
                              p = Palet()
                              b = Balle(p.centerx,p.top-Locale.balle_size[1])
                              t = time.Clock()
                              tt =0
                              laps = 40
                              while not event.peek(QUIT) and Locale.screen_rect.contains(b):
                                  event.clear()
                                  b.update()
                                  p.update()
                                  tt += t.tick()
                                  if tt > laps:
                                      Locale.screen.blit(Brick.static_shadow,(0,0))
                                      Locale.screen.blit(Brick.static_bg,(0,0))
                                      for i in Balle.all:
                                          Locale.screen.fill(Locale.shadow_color,b.move(*Locale.shadow_offset))
                                          Locale.screen.fill(Locale.balle_color,b)
                                      Locale.screen.fill(Locale.shadow_color,p.move(*Locale.shadow_offset))
                                      Locale.screen.fill(Locale.palet_color,p)
                                      display.flip()
                                      tt -= laps
                              

                              Image utilisateur
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Python c'est bon, mangez-en. 

                                12 février 2011 à 19:47:55

                                Citation : GurneyH

                                Hum, la collision balle-brique je t'assure qu'un débutant ne la fera pas. ;)

                                J'ai testé le sujet il y a peu, c'est loin d'être simple(facile).


                                clair, je suis entrain d'un refaire un (ci-dessus en attendant que qq1 décide de créer le sujet ^^), c'est vraiment pas du niveau débutant ...
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                [A supprimer]

                                × 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