Partage
  • Partager sur Facebook
  • Partager sur Twitter

Demande d'aide Pong Python

Sujet résolu
    2 mars 2016 à 19:36:34

    Bien le bonjour, bonsoir.

    On m'a demandé dans un club au lycée de créer (enfin de continuer puisque les graphismes étaient déjà créés) un pong.

    Donc voilà comment s'organise le programme: La balle rebondit sur les côtés hauts et bas. Lorsque la balle touche le côté droit ou gauche elle retourne à son point de départ en se dirigeant vers le côté perdant. La direction des raquettes est faite par des touches.

    Voilà ma problématique: j'aimerais que ma balle rebondisse lorsqu'elle touche une raquette. Problème, dans le code initial imposé par mon professeur ma balle est une image et son centre de gravité est un point -> ma variable. ( je vous joins l'image et ses dimensions). Ceci est une raquette.

    Et voici les dimensions de la balle:

    La balle se déplace à la vitesse VX et VY

    Je me demandais alors: comment faire pour que la balle rebondisse sur la raquette?

    Je vous remercie, et si vous avez besoin de plus de renseignements je me porterais garant de vous les joindre :D

    -
    Edité par paulequinet 2 mars 2016 à 19:38:48

    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2016 à 19:43:28

      Bonjour
      Avant de repondre il nous manque des éléments.
      Le code initial de ton prof. ?
      Bibliothèque utilisé pygame?
      Je suis en train d'en faire un , plusieurs solutions peuvent être envisagées , notamment en utilisant des rectangles pour les 4 bords plus deux pour les raquettes et une pour la balle . Ça facilité grandement les collisions avec pygame. 
      @+
      • Partager sur Facebook
      • Partager sur Twitter
      http://sinclair.recreatedzxspectrum.com/index.php
        2 mars 2016 à 19:59:28

        Dark-linux a écrit:

        Bonjour

        Avant de repondre il nous manque des éléments.
        Le code initial de ton prof. ?
        Bibliothèque utilisé pygame?
        Je suis en train d'en faire un , plusieurs solutions peuvent être envisagées , notamment en utilisant des rectangles pour les 4 bords plus deux pour les raquettes et une pour la balle . Ça facilité grandement les collisions avec pygame. 
        @+

        Merci pour ta réponse rapide!

        Voici le code initial de mon professeur mail il manque la banque d'image. Il m'a demandé de commencer à # ICI VOTRE CODE

        La suite c'est moi et j'ai pu y ajouter des annotations.

        
        from tkinter import *
        import pygame.mixer
        from random import randint
        
        def placeBonus(x,y,t):
            """
            Dessine un bonus de type t au point de coordonnées (x,y)
            Si t = 0, cache le bonus
            """
            Fond.itemconfig(Bonus, image=fichiers_bonus[t])
            Fond.coords(Bonus,x,y)
        
        def enfoncee(evt):
            """
            Fonction qui est déclenchée lorsque on appuie sur
            une touche. On met à jour la liste Touches
            """
            t = evt.keysym.upper()
            if not t in Touches:
                Touches.append(t)
        
        def relachee(evt):
            """
            Fonction qui est déclenchée lorsque on relâche une
            touche. On met à jour la liste Touches
            """
            t = evt.keysym.upper()
            if t in Touches:
                Touches.remove(t)
        
        def centrer():
            """
            Centre la fenetre au démarrage
            """
            w = fenetre.winfo_screenwidth()
            h = fenetre.winfo_screenheight()-70
            rootsize = tuple(int(_) for _ in fenetre.geometry().split('+')[0].split('x'))
            x = w/2 - rootsize[0]/2
            y = h/2 - rootsize[1]/2
            fenetre.geometry("%dx%d+%d+%d" % (rootsize + (x, y)))
        
        def dessine():
            """
            Cette fonction place la balle en (X,Y), la raquette1 en (X1,Y1)
            et la raquette2 en (X2,Y2). Elle ne renvoie rien.
            """
            Fond.coords(balle,X,Y)
            Fond.coords(J1,X1,Y1)
            Fond.coords(J2,X2,Y2)
        
        def scores(j1,j2):
            """
            Fonction qui reçoit en entrée le score j1 du joueur 1 et le score j2 du joueur 2
            et qui l'affiche. Cette fonction ne renvoie rien
            """
            Fond.itemconfig(Score1,text=str(j1))
            Fond.itemconfig(Score2,text=str(j2))
        
        
        def joue(x) :
            """ Joue le son n° x :
                1 : rebond sur une raquette, 2 : rebond sur un bord du terrain, 3 : but, 4 : passage sur un bonus
            """
            sons[x-1].play()
        
        def animation():
            global X, Y, VX, VY, X1, Y1, X2, Y2, S1, S2, G, XG, YG
        
            # ICI VOTRE CODE
        
            X = X + VX
            Y = Y + VY
        
        
            # REBONDS AUX BORDS HAUT & BAS
            if Y > 554:
                VY = - VY
            if Y < 146:
                VY = - VY
        
            # RETOUR AU CENTRE SI BUT
            if X > 884:
                X = 500
                Y = 350
                VX = - VX
            if X < 116:
                X = 500
                Y = 350
                VX = - VX
        
            # DEPLACEMENT RAQUETTE 2
            if '2' in Touches:
                Y1 = Y1 + 3
            if '8' in Touches:
                Y1 = Y1 - 3
            if Y1 < 180:
                Y1 = Y1 + 5
            if Y1 > 520:
                Y1 = Y1 - 5
        
            # DEPLACEMENT RAQUETTE 1
            if 'W' in Touches:
                Y2 = Y2 + 3
            if 'A' in Touches:
                Y2 = Y2 - 3
            if Y2 < 180:
                Y2 = Y2 + 5
            if Y2 > 520:
                Y2 = Y2 - 5
        
            # REBONDS RAQUETTE 2
        
        
        
        
            dessine()
            fenetre.after(10,animation)
        
        # La fenêtre
        
        fenetre=Tk()
        
        fenetre.title("Oisux PONG")
        fenetre.geometry("1000x600")
        fenetre.resizable(width=False, height=False)
        
        # Dessin du fond
        Fond=Canvas(fenetre,width=1000,height=600,bg="black")
        Fond.place(x=0,y=0)
        
        fichier_haut = PhotoImage(file="haut.gif")
        Fond.create_image(0, 0, image=fichier_haut, anchor='nw')
        fichier_terrain = PhotoImage(file="terrain.gif")
        Fond.create_image(100, 100, image=fichier_terrain, anchor='nw')
        fichier_balle = PhotoImage(file="balle.gif")            # Source : https://openclipart.org/detail/27075/basketball
        balle = Fond.create_image(0, 0, image=fichier_balle)
        fichier_joueur1 = PhotoImage(file="R1.gif")             # Source : https://openclipart.org/detail/21189/Glossy%20Rectangle
        J1 = Fond.create_image(0, 0, image=fichier_joueur1)
        fichier_joueur2 = PhotoImage(file="R2.gif")
        J2 = Fond.create_image(0, 0, image=fichier_joueur2)
        fichier_gauche = PhotoImage(file="gauche.gif")
        Fond.create_image(0, 100, image=fichier_gauche, anchor='nw')
        fichier_droite = PhotoImage(file="droite.gif")
        Fond.create_image(900, 100, image=fichier_droite, anchor='nw')
        
        fichiers_bonus = [PhotoImage(file="vide.gif"), PhotoImage(file="bonus1.gif"), PhotoImage(file="bonus2.gif"), PhotoImage(file="bonus3.gif")] # https://openclipart.org/detail/118039/Sphere%20w%2Fbezel.%20Esfera%20con%20bisel
        Bonus = Fond.create_image(100,100,image = fichiers_bonus[0])
        Score1=Fond.create_text(200,50,text="0",font=("comic sans ms","45"),fill="#FFFF00")
        Score2=Fond.create_text(800,50,text="0",font=("comic sans ms","45"),fill="#FFFF00")
        pygame.mixer.pre_init(44100,-16,2,2048)
        pygame.mixer.init()
        sons = [pygame.mixer.Sound("paf.ogg"), pygame.mixer.Sound("rebond.ogg"), pygame.mixer.Sound("but.ogg"), pygame.mixer.Sound("bonus.ogg")]   # Source http://www.universal-soundbank.com/
        
        
        # Initialisation du projet : les variables du programme :
        Touches = []
        X,Y = 500, 350       # Position de la balle
        X1,Y1 = 890, 180                    # Position du joueur 1
        X2,Y2 = 110, 520                    # Position du joueur 2
        S1, S2 = 0, 0                       # Scores des joueurs
        G, XG, YG = 0, 0, 0             # Type et coordonnées du bonus
        VX, VY = 5, 3
        
        # La boucle principale :
        animation()
        
        # Surveillance des touches
        fenetre.bind_all("<KeyPress>",enfoncee)
        fenetre.bind_all("<KeyRelease>",relachee)
        fenetre.after(10,centrer)
        
        fenetre.mainloop()





        -
        Edité par paulequinet 2 mars 2016 à 20:00:23

        • Partager sur Facebook
        • Partager sur Twitter
          2 mars 2016 à 20:02:22

          Salut ! Si ta balle se déplace de droite a gauche sur l'axe des X, il suffit de dire : "Si la balle touche la raquette, alors VX = VX * -1.

          Après si tu veut faire des effets (angle plus ou moins grand selon l'endroit où la balle rebondit) c'est plus compliqué, mais pas non plus insurmontable.

          • Partager sur Facebook
          • Partager sur Twitter
            2 mars 2016 à 20:28:51

            DonneeRex84 a écrit:

            Salut ! Si ta balle se déplace de droite a gauche sur l'axe des X, il suffit de dire : "Si la balle touche la raquette, alors VX = VX * -1.

            Après si tu veut faire des effets (angle plus ou moins grand selon l'endroit où la balle rebondit) c'est plus compliqué, mais pas non plus insurmontable.


            Salut et merci pour ta réponse mais comme j'ai dit en haut, la raquette est une image et c'est le point au centre qui lui permet de déplacer l'image et non l'entité qu'elle pourrait représenter ^^
            • Partager sur Facebook
            • Partager sur Twitter

            Demande d'aide Pong Python

            × 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