Partage
  • Partager sur Facebook
  • Partager sur Twitter

HELLLLPPPP !!! problème de collision

    14 avril 2019 à 15:05:02

    Bien le bonjour à tous,

    je rencontre un PROBLÈME de collision dans mon programme, en effet j'aimerais qu'il y est une collision entre une particule , et un carré, or pour l'instant la particule traverse le carré .

    voici mon programme en c++ :

    #include <Grapic.h>
    #include <cmath>
    #include <ctime>
    #include <time.h>

    using namespace grapic;

    const int DIMW = 500;
    const int MAXPART = 100;
    const float FRICTION = 0.9;

    struct Vec2 {
        float a;
        float b;
    };

    Vec2 operator+(Vec2 a, Vec2 b) {
        Vec2 c {a.a+b.a, a.b+b.b};
        return c;
    }

    Vec2 operator*(Vec2 a, Vec2 b) {
        Vec2 c {a.a * b.a - a.b * b.b, a.a * b.b + a.b * b.a };
        return c;
    }

    Vec2 operator*(float a, Vec2 b) {
        Vec2 c {a*b.a, a*b.b};
        return c;
    }

    Vec2 operator-(Vec2 a, Vec2 b) {
        Vec2 c {a.a - b.a, a.b - b.b };
        return c;
    }

    Vec2 operator/(float a, Vec2 b) {
        Vec2 c {a/b.a, a/b.b};
        return c;
    }

    struct particle {
        Vec2 pos;
        Vec2 speed;
        Vec2 force;
        float mass;
    };

    struct World {
        particle parts[MAXPART];
        int n;
    };




    void partAddForce(particle &p, Vec2 f) {
        p.force = p.force + f;
    }

    void partUpdatePV(particle &p)
    {
        if(p.pos.a < 10)
        {
            p.pos.a += 2*(10-p.pos.a);
            p.speed.a = - FRICTION * FRICTION * p.speed.a;
            p.speed.b = FRICTION * p.speed.b;
        }
        else if(p.pos.a > DIMW - 10)
        {
            p.pos.a += 2*(DIMW-10 - p.pos.a);
            p.speed.a = -FRICTION * FRICTION * p.speed.a;
            p.speed.b = FRICTION * p.speed.b;

        }
        if(p.pos.b < 10)
        {
            p.pos.b += 2*(10-p.pos.b);
            p.speed.b = -FRICTION * FRICTION * p.speed.b;
            p.speed.a = FRICTION * p.speed.a;

        }
        else if(p.pos.b > DIMW - 10)
        {
            p.pos.b += 2*(DIMW-10 - p.pos.b);
            p.speed.b = -FRICTION * FRICTION * p.speed.b;
            p.speed.a = FRICTION * p.speed.a;
        }

        p.pos = p.pos + p.speed;
        p.speed = p.speed + ( (1 / p.mass) * p.force);
    }

    struct carre
    {
        Vec2 VV;
        int score;
    };

    void draw(World a, carre C) {

        color(200, 0, 0, 200);

        for(int i =0; i < a.n; i++)
        {
            color(rand()%255 , rand()%255,rand()%255 ,255); // qui va permettre de générer aléatoirement des couleurs
            circleFill(a.parts[i].pos.a, a.parts[i].pos.b, 15);//15 = taille des boules
        }
        color(38,196,236);
    }

    void initcarre(carre& C)
    {
        C.VV.a = 50;
        C.VV.b = DIMW - 20;
        C.score = 0;
    }

    void draw2(carre& C)
    {
        float dt = 0.01;
        if(C.VV.a < DIMW-20)
        {
            C.VV.a = C.VV.a+2*dt;
        }
        else
        {
            initcarre(C);
        }
        color(38,196,236);
        rectangleFill(C.VV.a-20,C.VV.b-10,C.VV.a+20,C.VV.b+10);

        fontSize(50);
        print(50,50,C.score);
    }



    void update(World &a, carre& C) {
        for(int i = 0; i < a.n; i++)
        {
            partUpdatePV(a.parts[i]);
            if(abs(a.parts[i].pos.b-C.VV.b)<1 && abs(a.parts[i].pos.a-C.VV.a)<9)
            {
                C.score= C.score+1;
            }
        }

    }


    void init(World &a) {
        srand(time(NULL));
        a.n = 1;
        for(int i = 0; i < a.n; i++) {
            a.parts[i].pos.a = DIMW/2;  //j'ai diviser la taille de la fenetre en abscisse par deux pour que la balle s'affiche au milieu dès le lancement du programme
            a.parts[i].pos.b = 0;   //j'ai mis 0 pour que la balle soit tout en bat (en gros 0 en ordonné)
            a.parts[i].speed.a = 0;
            a.parts[i].speed.b = 0;
            a.parts[i].force.a = 0;
            a.parts[i].force.b = 0;//a 0 le balle de rebondi plus à chaque depp ,lacement
            a.parts[i].mass = 1;
        }
    }

    void CollisionPartETCarre(particle& part, carre c)
    {
       
    }


    void jump(World &a)


        {
            int i;
            if (isKeyPressed(SDLK_SPACE))
            {
                a.parts[i].speed.b = frand(0,8);
            }
            if (isKeyPressed(SDLK_LEFT))
            {
                a.parts[i].pos.a=a.parts[i].pos.a - 10;
                a.parts[i].pos.b=0;
               // a.parts[i].speed.a = - 0.5; //permet de faire bouger la boule a gauche fluidement au lieu qu'elle ne saute
               // a.parts[i].speed.b = 1; //ca le fais  sauter
            }
            if (isKeyPressed(SDLK_RIGHT))


            {
                 a.parts[i].pos.a=a.parts[i].pos.a + 10;
                a.parts[i].pos.b=0;
                //a.parts[i].speed.a = 0.5;//permet de faire bouger la boule a droite fluidement au lieu qu'elle ne saute
               // a.parts[i].speed.b = 1; //ca le fais  sauter
            }
        }




    int main(int , char ** )
    {
        World dat;
        carre C;
        bool stop=false;
        winInit("Particles", DIMW, DIMW);
        backgroundColor( 255, 255, 255 );
        init(dat);
        initcarre(C);


          while( !stop )
        {
            winClear();

            update(dat,C);
            draw(dat,C);
            draw2(C);
            jump(dat);
            stop = winDisplay();
        }

        winQuit();
        return 0;
        }

    ps :Toutes aide me sera bénéfique je bloque dessus depuis un petit moment .

    MERCIII !!

    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2019 à 11:03:46

      Salut,

      Je viens de voir que les balises de code sont revenues donc il n'y a plus d'excuses pour ne pas les utiliser :) . A part ça, pas besoin de crier 'HELP' dans le titre de ton post, tout le monde voit ton message et tu n'obtiendras pas de traitement de faveur en criant plus fort que les autres.

      Sinon, tu prétend recontrer un problème (c'est à dire que tu essaie de faire quelque chose mais qu'un obstacle t'empêche d'atteindre ton objectif), pourtant, ta fonction 

      void CollisionPartETCarre(particle& part, carre c)
      {
          
      }

      est vide et en plus tu ne l'appelle nulle part dans ton code. o_O

      Tu veux qu'on fasse ton boulot à ta place ?

      Bon allez, je suis de bonne humeur, je vais te donner le bout de code qui te permettra de détecter la collision :

      bool areColliding(const Particle &part, const Square square)
      {
      	return
      		(
      		part.pos.x >= square.pos.x &&
      		part.pos.x <= square.pos.x + square.size.x &&
      		part.pos.y >= square.pos.y &&
      		part.pos.y <= square.pos.y + square.size.y
      		);
      }

      Mis à part ça, quelques remarques :

      • Arrête d'utiliser rand(), si tu veux faire de l'aléatoire, interesse-toi au header <random> (http://www.cplusplus.com/reference/random/)
      • Fais un choix entre l'anglais et le français pour tes classes.
      • Prend des noms de variables et de méthodes plus clair (partUpdatePV ?, carre.VV ?).
      • Mets des commentaires utiles, principalement des en-têtes de méthodes et de classes/structures.
      • Contrôle le temps dans ta simulation; choisis une durée de temps pour chaque frame et met à jours les éléments de ta simulation en fonction de cette durée.

      -
      Edité par Raynobrak 15 avril 2019 à 11:05:07

      • Partager sur Facebook
      • Partager sur Twitter

      HELLLLPPPP !!! problème de collision

      × 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