Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rebondissement de ma balle sur un mur vertical

Sujet résolu
    11 juin 2006 à 15:02:48

    Bonjour,

    J'ai enfin réussi à faire pour mon jeu Air Hockey le test de collision entre le palet et le pommeau du joueur, et que quand le palais touche un mur le a de la fonction devient - a. Ca marche pour les murs en haut et en bas (ceux horizontals) mais pour les deux murs verticaux cela ne veut pas marché. J'ai réfléchi à faire comme equation quand le palais atteind un de ces murs: y = - ax + b sachant que y = posPalais.y // x = posPalais.x // et b (quand elle atteind un mur vertical) = posPalais.y. Je vous donne mon code de la fonction pour que quelques gens aimable puissent trouver ou est mon erreur :D


    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include "jeu.h"
    #include "constantes.h"
    #include "collision.h"
    void jouer(SDL_Surface* ecran)
    {
        SDL_Surface *plateforme=NULL, *jBleu=NULL, *jRouge=NULL, *palais=NULL;
        SDL_Surface *coordX=NULL, *coordY=NULL;
        SDL_Rect pos, posJoueur, posOrdi, posPalais;
        SDL_Rect posCoordonneeX, posCoordonneeY;
        SDL_Event event;
        SDL_Color noir = {0,0,0};
        TTF_Font *police = NULL;
        int continuer = 1;
        int carte[LARGEUR_FENETRE][HAUTEUR_FENETRE] = {0};
        int tempsActuel = 0, tempsPrecedent = 0;
        int collisionJoueurPalais = 0, contact = 0, booleen = 0;
        int collisionPalaisMur = 0;
        int directionPalais=2; // == Pas de déplacement
        double a = 0, b = 0;
        char coordonneeX[3] = "", coordonneeY[3] = "";

        /* Mise en mémoire des sprites */
        plateforme = IMG_Load("plateforme.jpg");
        jBleu = IMG_Load("Jbleu.png");
        jRouge = IMG_Load("Jrouge.png");
        palais = IMG_Load("palais.png");

        pos.x = 0;
        pos.y = 0;
        posPalais.x = 500;
        posPalais.y = 180;
        posJoueur.x = 500;
        posJoueur.y = HAUTEUR_FENETRE / 2 - 50;
        posOrdi.x = 100;
        posOrdi.y = HAUTEUR_FENETRE / 2 - 50;
        posCoordonneeX.x = 20;
        posCoordonneeX.y = 0;
        posCoordonneeY.x = 20;
        posCoordonneeY.y = 10;

        SDL_ShowCursor(SDL_DISABLE); // Effacement du curseur

        police = TTF_OpenFont("arial.ttf",12); // Mise en mémoire de la police

        while(continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                break;

                case SDL_MOUSEMOTION:
                    posJoueur.x = event.motion.x - 30;
                    posJoueur.y = event.motion.y - 30;

                    collisionJMur(&posJoueur);
                    collisionPalaisMur = collisionPMur(&posPalais);
                    collisionJoueurPalais = collisionJP(&posJoueur,&posPalais);

                    if (collisionJoueurPalais)
                    {
                        contact = 1;

                    }
                    else
                        contact = 0;

                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));

            if (contact)
            {
                if (posJoueur.x != posPalais.x && posJoueur.y != posPalais.y)
                    a=(posPalais.x - posJoueur.x) / (posPalais.y - posJoueur.y);
                else
                    posPalais.y++;
            }

            /* Affichage des coordonnees de la souris */
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent >= 20)
            {
                /* Coordonnées de la souris */
                sprintf(coordonneeY,"coordonnee.y = %dpx",posJoueur.y);
                coordY = TTF_RenderText_Solid(police,coordonneeY,noir);
                sprintf(coordonneeX,"coordonnee.x = %dpx",posJoueur.x);
                coordX = TTF_RenderText_Solid(police,coordonneeX,noir);

                /* Contact Palais Mur */

                    if (collisionPalaisMur)
                        a = -a;

                    b=posPalais.y - (a * posPalais.x);

                    if (directionPalais == 2)
                    {
                        if (posJoueur.x > posPalais.x)
                        {
                            posPalais.x = posPalais.x - 5;
                            directionPalais = 0; // gauche
                        }
                        else if (posJoueur.x < posPalais.x)
                        {
                            posPalais.x = posPalais.x + 5;
                            directionPalais = 1;
                        }
                    }


                    if (!(directionPalais))
                        posPalais.x = posPalais.x - 5;
                    else if (directionPalais)
                        posPalais.x = posPalais.x + 5;

                    if (collisionPalaisMur == 2)
                    {
                        a = -a;
                        b = posPalais.y;
                    }

                    posPalais.y = a * posPalais.x + b;



                tempsPrecedent = tempsActuel;

            }

            /* Blitage des surfaces */
            SDL_BlitSurface(plateforme,NULL,ecran,&pos);
            SDL_BlitSurface(palais,NULL,ecran,&posPalais);
            SDL_BlitSurface(jBleu,NULL,ecran,&posJoueur);
            SDL_BlitSurface(jRouge,NULL,ecran,&posOrdi);
            SDL_BlitSurface(coordX,NULL,ecran,&posCoordonneeX);
            SDL_BlitSurface(coordY,NULL,ecran,&posCoordonneeY);
            SDL_Flip(ecran);
        }
        /* Libération des surfaces */
        SDL_FreeSurface(plateforme);
        SDL_FreeSurface(jBleu);
        SDL_FreeSurface(jRouge);
        SDL_FreeSurface(palais);
        SDL_FreeSurface(coordX);
        SDL_FreeSurface(coordY);
        /* Libération de la police */
        TTF_CloseFont(police);
    }


    En espérant qu'on puisse m'aider, je vous souhaite à tous une agréable journée

    ps:
    collisionPalaisMur = 2 =>> palais touche un mur vertical
    collisionPalaisMur = 1 =>> palais touche un mur horizontal
    collisionPalaisMur = 0 =>> palais ne touche pas de mur
    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2006 à 15:50:36

      Citation : Pas de titre

      collisionPalaisMur = 2 =>> palais touche un mur vertical
      collisionPalaisMur = 1 =>> palais touche un mur horizontal
      collisionPalaisMur = 0 =>> palais ne touche pas de mur



      utilise un "enum"...
      • Partager sur Facebook
      • Partager sur Twitter
        11 juin 2006 à 22:19:46

        Salut a tous
        Pour les murs verticaux, rien de plus simple :

        #define MUR_A_DROITE 1
        #define MUR_A_GAUCHE 2

        int collisionMurVerticaux(SDL_Surface *balle, SDL_Rect posBalle, SDL_Surface *mur, SDL_Rect posMur, int flags)
        {
           if(flags == MUR_A_DROITE)
           {
              if(posBalle.x + balle->w >= posMur.x){return 1;}
           }
           if(flags == MUR_A_GAUCHE)
           { 
              if(posBalle.x <= posMur.x + mur->w){return 1;}
           }
           return 0;
        }

        Ca, c'est si tes murs sont des surfaces, si par contre, ce sont les bords de la fenêtre, il faut utiliser ceci:

        int collisionBordFenetre(SDL_Surface *balle, SDL_Rect posBalle, SDL_Surface *ecran)
        {
           if((posBalle.x <= 0)||(posBalle.x + balle->w >= ecran->w)){return 1;}
           else{return 0;}
        }


        Ainsi, si la fonction utilisée renvoie 1, il y a collision, sinon (si c'est 0), il n'y a rien.
        @+
        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2006 à 11:25:39

          mais ça depend: si ça rebondit sur le murde droite yaura pas que -a, il faudra changer pour que :
          -ax+b'=y=ax+b
          b'=2ax+b
          donc si ça touche le muir de droite faut faire ça !!! bonne chance g aps tout lu mais a mon a vie tu las aps fait si ça bug ;;..
          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2006 à 11:36:54

            Re à tous !!!

            Si tu veux que la balle rebondisse perpendiculairement sur le bord, il faut faire a = -(1/a) et non a = -a. Ensuite, comme le dit Niak, il faut modifier b afin que la balle garde sa position y (et éviter qu'elle ne parte on ne sait où) => encore une chtite équation :
            On veut le nouveau b (ici b') tel que ax + b (ce qui équivaut à y) = -(1/a)*x + b' ce qui nous donne au final ax + b + (1/a)*x = b'.
            Ensuite seulement tu met la nouvelle attribution de a (dans mon cas a = -(1/a);)
            Si je me suis trompé, n'hésitez pas à me le faire remarquer ;) .
            Bien sûr, les calculs des positions x et y seront effectués après modification de l'équation de la droite.

            @+
            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2006 à 11:56:54

              pourquoi -1/a ??? la ça fairait pas un rebond sur un mur droit ! ou alors tu parles du mur horizontal ??? ah nan c moi ki faisait le mur horizontal dans ces cas la ?, bon repondss jen c rien !!!!!! ...
              merki
              edit :
              mais na toi ça fait pas un rebond! c un rebond sur un mur de biais que tu nous fait ! grrrrrrrrrrrrrrrrrrr mais tu m'emmeles les pinxceaux toi, mm si je suis aps artiste !
              • Partager sur Facebook
              • Partager sur Twitter
                12 juin 2006 à 12:11:37

                En fait, j'avais oublié de le dire, mais pour simuler le rebond, il faut partir dans l'autre sens => un petit booléen peut permettre la gestion de ceci:

                SI collision avec n'importe quel mur
                ALORS (SI le booléen vaut 1 => 0>>le booléen
                SINON SI le booléen vaut 0 => 1>> le booléen)
                En fonction de la valeur du booléen, on décrémente ou incrémente x (pas de prise en compte de la vitesse ici).
                Ensuite, d'où sort le -1/a => ce sont des maths :
                J'ai vu cette année que pour que 2 droites soient perpendiculaires, il faut que leurs coefficients directeurs (a) soient inverse et opposés.
                Je pense que cela doit marcher quelque soit le mur (horizontal ou vertical), mais je n'ai pas testé :euh: . A vous de le faire :D .
                @+
                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2006 à 15:46:34

                  Merci à tous d'avoir répondu, je voudrais simplement demander a el_rere de réexpliquer si ca ne le dérange biensûr pas son dernier post, j'avoue que je n'ai pas très bien compris ^^ Voici mon code ou je change pour les collisions palais -> murs verticaux


                                  if (collisionPalaisMur == 2)
                                  {
                                      b2 = a * posPalais.x + b + 1/a * posPalais.x;
                                      a = -(1/a);
                                      posPalais.y = a * posPalais.x + b2;
                                  }


                  Pourrais-tu me dire ou est l'erreur du programme ? (pas de syntaxe mais de rebond ^^)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 juin 2006 à 15:52:58

                    Peux tu me préciser quel est l'effet produit lorsqu'il y a collision avec un mur vertical?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 juin 2006 à 16:55:48

                      Quand la balle arrive vers le bas et cogne le mur vertical, elle descent verticalement vers le bas, et inversement (balle arrive vers le haut et cogne le mur, la balle remonte en haut verticalement). J'avoue que c'est très bizard ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 juin 2006 à 18:05:26

                        pour moi tu as juste à changer la coordonnée en x de ta vitesse comme ceci quand elle tape à droite ou à gauche:
                        vitesseX=-vitesseX;


                        sachant que la vitesse de ma balle je la fais évoluer comme ceci:
                        positballe.x=positballe.x+vitesseX;


                        à toi de voir... perso moi c'est nickel :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 juin 2006 à 22:19:18

                          oui mais la les droites ne sont pas forcément perpendiculaires, elles sont seulement symétriques par rapport à la normale au mur passant par le point de concour du mur et de la trajectoire de la balle... donc ça marche pas hinhinhin et moi g raison. Bon je vous trouve une solution pour un mur d'eq° ax+by+c=0 (ça inclut les droites verticales, horizontles et penchées pour ceuw qui ne connaissent pas) pour demain. Bonne nuit a tous les ZerOs !!!!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2006 à 13:38:43

                            Ok, merci, si tu as une réponse, je l'attend avec impatient. J'essaye aussi de mon côté pour trouver la solution mais je n'ai encore rien de très concret.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 juin 2006 à 13:56:22

                              attends moi g trouvé un truc super complexe je vous lenvoie par page web dés que jai fini de mamuser sur le html :> mais bon ça ce sont mes petits trip comme,ça tu pourrs faire un mur de biais et savoir comment la balle rebondi !!! lol c passionnant je sais mais bon ... c'est moi ! bo,nne chance pour les maths. En fait je viens de passer mon bac de fr==> c la premiere fois que kj'écris autant !!!
                              @+
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 juin 2006 à 14:12:53

                                Ok merci beaucoup, j'attend ta réponse ou un EDIT alors, c'est gentil.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 juin 2006 à 14:14:21

                                  j'espere que tu n'as pas ecrit avec autant de fautes sur ta copie :p

                                  j'ai pas compris dans ton jeu tu as des murs en biais?

                                  tu l'a rajouté apres ? Parsque tu n'en parles pas dans ton premier topic SeyZ
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 juin 2006 à 14:20:32

                                    lol les urs en biais c'est moi qui mamuse a faire des maths c tt ! mais bon apres vous en faites ce que vous en voulez, de mes maths .... même les jeter mais bon la je serais triste. je vous coànseil ce site c marrant. L'accueuil est... spécial mais c marrant. et ceux qui ne connaissent pas l'anglais, bite=mordre. Salut
                                    <attention></attention>CLIQUEZ !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 juin 2006 à 14:33:37

                                      J'ai rien compris à vrai dire, des murs en biais = ?
                                      et ce site, je ne vois pas trop le rapport :s
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 juin 2006 à 14:36:43

                                        Niak , j'adore les maths et tout et tout et si tu veux en parlé mp moi
                                        mais la tu fais un gros HS et tu embrouilles SeyZ, tu ne l'aides pas trop avec tout ca :-°

                                        donc mp me y'a pas de probleme :) mais pas dans ce topic !

                                        SeyZ repose les problemes que t'a encore ,si tu n'a pas encore trouvé la reponse
                                        parsque là je suis plus trop o_O

                                        c'est bon tu arrives à faire rebondire le ballon avec le mur vertical?
                                        esque ton jeu est realiste ( esque la balle change de vitesse )??


                                        PS : ton lien serait tres mal vu si un modérateur voit ca ... parsque voila quoi ...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          13 juin 2006 à 14:50:03

                                          Mon problème est toujours le même, je n'arrive pas à faire rebondir la balle sur les murs verticaux.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            13 juin 2006 à 22:39:46

                                            bon alors sur les murs verticaux(je n'ai as tout lu la flemme ^^ donc dsl):
                                            le sens est 1 a la base
                                            l'équation y=ax+b
                                            la position du mur sur l'axe des abscisse est notée c.
                                            donc lorsque la balle arrive en c, le 'a' est inversé:
                                            a=-a;

                                            mais la hauteure de la balle est constante:
                                            -ax+b'=ax+b
                                            donc b'=2ax+b
                                            et aussi le sens est inversé.
                                            donc ça nous fait
                                            b+=2*a*x;
                                            a=-a;
                                            sens=-sens;

                                            pour les murs horizontaux c'est pareil mais le sens n'est pas inversé ! voila tu as tout. Bonne chance
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 juin 2006 à 21:41:24

                                              bon ça vous va ou pas ? et pis si tu veux des infos supplémentaires... Et sinan tu marques ce sujet fini !
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                15 juin 2006 à 6:56:51

                                                J'ai testé et ca marche comme il faut, je vous remercie tous de vos réponses, j'ai bien compris maintenant, j'avoue que je me compliquais pas mal la vie.
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Rebondissement de ma balle sur un mur vertical

                                                × 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