Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement de logiciels
  4. C
  5. [ALGO] algorithme de collision en fromage

[ALGO] algorithme de collision en fromage

Scheduled Pinned Locked Moved C
9 Posts 4 Posters 3.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C
    C
    cegdd
    wrote on last edited by
    #1

    <p>bonjour bonjour !</p>
    <p> </p>
    <p>pour <iframe data-embed-src="<base_url>/topic/545-reconqu%C3%AAte-salvatrice/,?do=embed" data-embedcontent="" frameborder="0" src="//melinyel.net/applications/core/interface/js/spacer.png"></iframe> j'ai codé un petit algorithme qui me permet de tester si notre personnage fait face à une image ou non.</p>
    <p>le tout avec une marge dynamique 😉 </p>
    <p> </p>
    <p><u>pour les non-initié à la SDL, la structure SDL_Rect contient les coordonnées : x, y, w et h d'une image.</u></p>
    <p> </p>
    <p>j'ai crois donc qu'il est important de vous le faire partager 😄 </p>
    <pre class="ipsCode prettyprint">
    bool colisionfromage(SDL_Rect lanceur, SDL_Rect recepteur, SDL_Rect curseur, double marge)
    {
    double degre, degre2, diff;
    int difx, dify;

    difx = (lanceur.x + lanceur.w/2) - (curseur.x + curseur.w/2); //calcul de la difference en pixel
    dify = (lanceur.y + lanceur.h/2) - (curseur.y + curseur.h/2); //entre le lanceur et le pointeur de la souris
    degre = atan2(dify, difx);//obtention de l'angle en radian
    
    difx = (lanceur.x + lanceur.w/2) - (recepteur.x + recepteur.w/2); //calcul de la difference en pixel entre
    dify = (lanceur.y + lanceur.h/2) - (recepteur.y + recepteur.h/2); //le lanceur et l'objectif
    degre2 = atan2(dify, difx);//obtention de l'angle en radian
    
    degre  *= 57.296;//conversion en degre
    degre2 *= 57.296;
    
    degre   += 180; //ajustement pour passer d'un systeme (-180/180) à un systeme (0/360)
    degre2  += 180;
    
    diff = degre-degre2;//calcul de la différence
    
    if (diff &lt; 0) //si diff est négatif, on le passe en positif
    {
        diff *= -1;
    }
    
    if (diff &lt;= 0 || diff &gt;= marge/2) //si la différence est plus grande que la marge, nous retournons FAUX
    {
        return FALSE;
    }
    return TRUE;
    

    }
    </pre>
    <p>si vous avez des questions / remarques, comme d'habitude, je vous écoute !</p>
    <p> </p>
    <p>edit : je sais que ce code a un défaut, le calcul de la différence ne marche pas si l'un est <360 et l'autre >0. mais je ne sais pas comment gérer ça simplement. des idées ?</p>

    créateur de Reconquête-Salvatrice, un petit RPG 2D en ligne multi-plateforme [OpenGL / C]

    1 Reply Last reply
    0
    • C
      C
      cegdd
      wrote on last edited by
      #2

      <p>décidement je n'ais pas été très long a l'améliorer en clareté ^^</p>
      <p>voici le nouveau code</p>
      <pre class="ipsCode prettyprint">
      bool colisionfromage(SDL_Rect lanceur, SDL_Rect recepteur, SDL_Rect curseur, double marge)
      {
      register double diff;

      diff = (FindAngle(lanceur, recepteur)+180) - (FindAngle(lanceur, curseur)+180);
      
      if (diff &lt; 0) //si diff est négatif, on le passe en positif
      {
          diff *= -1;
      }
      
      if (diff &lt;= 0 || diff &gt;= marge/2) //si la différence est plus grande que la marge, nous retournons FAUX
      {
          return FALSE;
      }
      return TRUE;
      

      }
      double FindAngle(SDL_Rect A, SDL_Rect
      {
      register int difx, dify;

      difx = (A.x + A.w/2) - (B.x + B.w/2);
      dify = (A.y + A.h/2) - (B.y + B.h/2);
      
      return atan2(dify, difx)* 57.296;
      

      }
      </pre>

      créateur de Reconquête-Salvatrice, un petit RPG 2D en ligne multi-plateforme [OpenGL / C]

      1 Reply Last reply
      2
      • mars073M
        mars073M
        mars073
        wrote on last edited by
        #3

        <p>mmhhh.. fromage ^-^</p><p>Très utile, merci du partage.</p><p>+1Rep</p>

        Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

        1 Reply Last reply
        0
        • C
          C
          cegdd
          wrote on last edited by
          #4

          <p>cet algorithme, couplé avec celui-ci :</p>
          <pre class="ipsCode prettyprint">
          int checkdistance(SDL_Rect A, SDL_Rect B, int lenght)
          {

          double difx = A.x+(A.w/2) - B.x+(B.w/2);
          double dify = A.y+(A.h/2) - B.y+(B.h/2);
          
          if (difx &lt; 0) {difx = difx*-1;}
          if (dify &lt; 0) {dify = dify*-1;}
          
          double resultat = sqrt((difx*difx)+(dify*dify));
          
          if (resultat &lt;= lenght) {return -1;}
          else if (resultat &gt; lenght) {return 1;}
          return 0;
          

          }
          </pre>
          <p>qui sert a vérifier la distance entre les milieux de deux images.</p>
          <p> </p>
          <p>permet donc de faire des collision de ce style :</p>
          <p> </p>
          <p><img alt="308789PrtScrcapture2.jpg" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://img4.hostingpics.net/pics/308789PrtScrcapture2.jpg"/></p>

          créateur de Reconquête-Salvatrice, un petit RPG 2D en ligne multi-plateforme [OpenGL / C]

          1 Reply Last reply
          0
          • AlexMogA
            AlexMogA
            AlexMog
            Modérateur spécialisé
            wrote on last edited by
            #5

            <p>Ouille, les passages des arguments par copie font bien mal là 😕 (n'oublie pas que SDL_* sont des structures, et que tu les passes par copie... Tu ralentit ton programme, et il consomme des ressources qu'il pourrait ne pas consommer. Je te conseille mon cours sur les bonnes pratiques en C 😉 )</p>
            <p> </p>
            <p>Sinon, gg l'algo</p>

            Multiplayer GameDev @ Unexpected
            

            Mon CV

            1 Reply Last reply
            0
            • AzadA
              AzadA
              Azad
              wrote on last edited by
              #6

              <p>Merci de ton partage, ça fait toujours plaisir à voir.<br/>
              Tu as besoin d'aide pour l'optimisation de ton code (je dis ça juste en référence au message d'AlexMog, je me permets pas de juger ton code 😉 ) ?</p>

              Administrateur du forum.
              Contactez-moi par message privé ou par mail.

              1 Reply Last reply
              0
              • C
                C
                cegdd
                wrote on last edited by
                #7

                <p>j'ai refait le code:</p>
                <pre class="ipsCode prettyprint">
                bool colisionfromage(SDL_Rect *lanceur, SDL_Rect *recepteur, SDL_Rect *curseur, double marge)
                {
                register double diff;

                diff = (FindAngle(lanceur, recepteur)+180) - (FindAngle(lanceur, curseur)+180);
                
                if (diff &lt; 0) //si diff est négatif, on le passe en positif
                {
                    diff *= -1;
                }
                
                if (diff &lt;= 0 || diff &gt;= marge/2) //si la différence est plus grande que la marge, nous retournons FAUX
                {
                    return FALSE;
                }
                return TRUE;
                

                }
                double FindAngle(SDL_Rect *A, SDL_Rect *
                {
                register int difx, dify;

                difx = (A-&gt;x + A-&gt;w/2) - (B-&gt;x + B-&gt;w/2);
                dify = (A-&gt;y + A-&gt;h/2) - (B-&gt;y + B-&gt;h/2);
                
                return atan2(dify, difx)* 57.296;
                

                }
                </pre>
                <p>@azad : je peux me débrouiller seul, mais de l'aide est toujours bienvenue 😄 </p>
                <p> </p>
                <p>@AlexMog: j'ai essayé de faire mieux, c'est ce que tu voulais ?</p>
                <p> </p>
                <p>d'autres idées ? =)</p>

                créateur de Reconquête-Salvatrice, un petit RPG 2D en ligne multi-plateforme [OpenGL / C]

                1 Reply Last reply
                0
                • AzadA
                  AzadA
                  Azad
                  wrote on last edited by
                  #8

                  <p>Je n'ai pas trop suvi l'ensemble du code, mais ça me semble bizarre que tu aies deux instructions pour le IF qui se suivent, et qui peuvent toutes les deux êtres "enclenchées".<br/>
                  Là, tu fais :</p>
                  <p>IF diff < 0</p>
                  <p>IF diff <= 0 ...<br/><br/>
                  Tu devrais peut-être tourner ça dans un else if à mon sens, et prendre le problème à l'envers. Je dis ça sur le coup, j'ai absolument pas réfléchis à la manière d'optimiser et ce n'est qu'une idée qui est peut-être fausse ! 🙂 <br/>
                  AlexMog pourrait approuver ou désapprouver mon idée (s'il arrive à comprendre ce dont je parle), et expliquerait ça peut être mieux que moi.</p>

                  Administrateur du forum.
                  Contactez-moi par message privé ou par mail.

                  1 Reply Last reply
                  0
                  • AlexMogA
                    AlexMogA
                    AlexMog
                    Modérateur spécialisé
                    wrote on last edited by
                    #9

                    <p>C'est mieux cegdd 🙂 </p>
                    <p>@Azad: je ne vois pas de quoi tu parles x)</p>
                    <p>Par contre, @cegdd: le mot clé "register" est déconseillé depuis gcc 1.2 (on est déjà à la 4.0), car tu empeche le compilateur de pouvoir faire ses propres optimisations mémoire (en sachant qu'il est plus intelligent que nous pour ça 🙂 )</p>

                    Multiplayer GameDev @ Unexpected
                    

                    Mon CV

                    1 Reply Last reply
                    0

                    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                    With your input, this post could be even better 💗

                    Register Login
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    • Login

                    • Login or register to search.
                    Powered by NodeBB Contributors
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • World
                    • Users
                    • Groups