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

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

Algorithmes et structures de données Discussion :

rebond d'une balle aux bords de l'écran


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut rebond d'une balle aux bords de l'écran
    Bon bon jour tout le monde, j'ai un gro probleme avec mon programme...
    je vous explik un peu
    Il sagit de fair bouger un ballon sur un terrain de foot ca n'a rien d'extraordinaire sauf que la balle doit pa sortir du terrain elle doit a chak foi k'elle arriv a la limite du terrain faire un ongle de 45 degres.... bon je suis arriver a faire bouger le ballon mais seulement avec les touche du clavier mais la balle sort du terrain...
    voila l'implementation de balle...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
      // Classe Ballle : Implementation
    //
    //************ Constructeur **********
    //
    Balle::Balle(int x, int y,int r)
    {
             X=x;
             Y=y;
             R=r;
             dx=dy=0;
     
    }
    //
    //*********** le déplacement **********
    //
    void Balle::Bouger()
    {
             X=X+dx;
             Y=Y+dy;
    }
    //
    //****** Changement de direction *******
    //
    void Balle::direction(int incX, int incY)
    {
     
     
             dx=incX;
             dy=incY;
    }
    //
    // le Trace
    //
     
    void Balle::Dessiner(CDC *dc)
    {
             int x1=-R/2+X;
             int y1=-R/2+Y;
             int x2=R/2+X;
             int y2=R/2+Y;
             dc->Ellipse(x1,y1,x2,y2);
    } 
     
    void Balle::condition(terrain stade)
    {
        if (HautG) ////si la balle a une direction Haut gauche 
    {if (X==stade.OX-R) {HautG=false; HautD=true;}
    /// si elle arrive sur la limite gauche
        if (Y==stade.OY+R) {HautG=false; BasG=true;}}
        ///si elle arrive sur la limite gauche
     
    if (HautD)
    {if (X==stade.OX+stade.l-R) {HautD=false; BasD=true; }
    if (Y==stade.OY+R) {HautD=false; BasD=true; }}
     
     
    //
    if (BasG)
    {if (Y==stade.OY+R) {BasG=false; BasD=true; }
    if (X==stade.OX-R) {HautG=false; HautG=true; }}
     
    if (BasD)
    {if (Y==stade.OX+stade.l-R) {BasD=false; HautG=true; }
    if (X==stade.OY-R) {BasD=false; HautD=true;}}
        }
    Si kelkun a une suggestion...
    merci d'avance....
    j'attend votre reponce...
    et si quelqu'un veut vraiment m'aider.... il y a un fichier attaché C' est tout ce je suis arrivé a faire... quelque modification me serai bien utile... merci

    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ton problème est un problème de gestion de collision.

    Comme tu es en 2D, c'est plus simple.


    En gros, il faut qu'a chaque fois que tu déplaces ton ballon, tu détectes si tu as franchis le bord de ton plateau de jeu (ici ton terrain), si c'est le cas, tu relances la balle dans la direction oposée.

    Dans un premier temps, Il ne faut pas que tu renvoie la balle à 45 °, il faut que tu la renvois avec le même angle que l'angle d'incidence avec lequel ta balle a frappé le bord du plateau de jeu. Ceci va pour un jeu simple mais ensuite, si ton ballon possède des effets, il faut que tu renvoie la balle avec un angle plus ou moins important (suivant l'effet), ce qui se fait au billard.

    Dans un premier temps également, tu peux renvoyer la balle avec la même force, mais plus tard, il faudra que tu renvois ta balle avec une force moindre (plus réaliste : le bord a absorbé une partie de l'énergie)

    Si ça peut t'aider, les collisions 2D constituent un sujet très abordé sur le net, une petite recherche sur google va rapidement satisfaire tes questions.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    merci porur votre aide...
    mais j'ai deja cherché sur google... j'ai pri tout les tuto de chez developpez.com concernant la 2D et l'MFC mais je pense que mon problem et tout bete
    parce que j'ai revisé a chaque foi le code... mais ca fonctionne pa si quelqu'un voulai bien y jeter un coup d'oeuil sur le code c'est un projet vc6(le fichier attaché avec le premier message)... merci

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Mai 2002
    Messages : 114
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    La première chose à faire est de relire attentivement ton code.
    Il me semble qu'il y ait plusieurs coquilles dedans...

    Comme ici par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (BasG)
    {if (Y==stade.OY+R) {BasG=false; BasD=true; }
    if (X==stade.OX-R) {HautG=false; HautG=true; }}

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Une méthode simple consiste à "laisser" la balle aller hors du terrain et, une fois les coordonnées calculées, à faire des symétries en fonction de sa position (exemple, symétrie par rapport au bord droit du terrain, si position virtuelle de la balle dans la tribune de droite).

    Les éventuelles symétries par rapport à chacune des 4 bandes sont à itérer tant que la balle n'est pas dans le terrain (Les itérations multiples sont seulemennt necessaire lorsque le chemin parcouru entre 2 tracés de la balle peut-être supérieur à la largeur du terrain).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    C'est une très bonne méthode qu'explique Graffito, mais il faut faire attention si la balle dépasse en haut et à droite aussi, il va y avoir deux symétries à faire... c'est pas forcement évident !!!
    Ce qu'il faut savoir, dans ce type de collision, c'est que la vitesse de l'objet (qu'on peut assimiler à un point si on ne traite pas les effets), doit être symétrisée par rapport au plan local de collision.
    Pour la gestion des effets, il ne faudra plus représenter la balle d'une manière ponctuelle mais comme un solide, il y a tout de même de grosse simplification, car on connais la forme, le déplacement et les calculs sont plan, il n'y a qu'un objet en mouvement. Il faudra alors prendre en compte l'adhérence de l'objet sur les bords (encore des simplifications), et sysmétriser la vitesse de l'objet au point de collision par rapport au plan de collision toujours... En retirant une composante tangentielle, composante dans le plan de collision, pour matérialiser l'adhérence. Et une composante normale, pour matérialiser l'absorption. Attention aus rotation de la balle, c'est la plus dur à modéliser !!!
    Si on tiens compte de la rotation dans les collisions, il ne faudra pas l'oublier non plus durant le traitement du déplacement... Et la ça commence à toucher à de la dynamique du solide => matrice d'inertie (grosses simplification encore car on est en 2D)...
    Mais bon tout n'est pas évidant...
    Première grosse démo en construction :
    http://bitbucket.org/rafy/exo2/

Discussions similaires

  1. Effet 3D : Rebond d'une balle
    Par arnolem dans le forum Téléchargez
    Réponses: 0
    Dernier message: 30/09/2011, 16h37
  2. Simuler rebond d'une balle
    Par Coco4486 dans le forum Ogre
    Réponses: 2
    Dernier message: 09/05/2008, 19h26
  3. Réponses: 1
    Dernier message: 02/05/2008, 02h19
  4. Rebond d'une balle sur un sol incliné
    Par franco01 dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 05/02/2006, 01h20
  5. [CSS] - une div aux bords arrondis ?
    Par 10-nice dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 23/09/2005, 15h47

Partager

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