| | Les collisions, besoin d'une grande aide! | |
| | Auteur | Message |
---|
bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Les collisions, besoin d'une grande aide! Mar 3 Avr à 18:54 | |
| Bonjour! Je viens poster mon problème sur la gestion des collisions, à vrai dire je n'y comprends plus rien... Pour le moment, je teste simplement si il y a collision entre un personnage que je dirige au clavier et un PNJ fixe! J'ai fais des accesseurs è la surface et aux positions X et Y de mon objet perso (mon personnage) et mon objet pnj. Par clarté, j'ai declaré des variables me donnant les valeurs de chaque coin de mon image pour le perso et pour le pnj. Voici l'attribution des valeurs aux variables (je réattribue les valeurs à chaque tour de boucle bien sur!) : - Code:
-
// pour le perso dirigé par le clavier sd1 = Perso.GetPositionX() + Perso.GetSurface()->w; // coin supérieur droit ig1 = Perso.GetPositionY() + Perso.GetSurface()->h; // coin inférieur gauche id1 = sd1 + Perso.GetSurface()->h; // coin inférieur droit // pour le PNJ sd2 = unPnj.GetPositionX() + unPnj.GetSurface()->w; // coin supérieur droit ig2 = unPnj.GetPositionY() + unPnj.GetSurface()->h; // coin inférieur gauche id2 = sd1 + unPnj.GetSurface()->h; // coin inférieur droit
Bien entendu, je ne me suis pas occupé du coin supérieur gauche étant donné qu'on l'a avec les accesseurs GetPositionX et GetPositionY... Et voici mon premier test : - Code:
-
if ((id1 >= unPnj.GetPositionY() && id1 <= ig2) || (sd1 >= unPnj.GetPositionY() && sd1 <= ig2)) MessageBox(0,"ok", "ok",0);
En bref, je teste si le coin inférieur droit de mon personnage est compris entre les coins supérieurs et inférieurs gauche de mon PNJ (la collision avec le côté gauche de mon image n'est pas suffisent je sais!), si c'est le cas, j'affiche une messageBox... Bah je sais pas si le compilateur le comprends pas comme moi, mais rien que la partie la, il me fait quelque chose qui n'a absolument rien avoir. J'ai le message dès le lancement du programme. Je précise que j'ai blitté mon perso aux points 150,150 et mon PNJ en 400, 300. Voila je pense avoir fini mes explications! Merci d'avance pour le coup de main! |
| ![Aller en bas](https://2img.net/i/empty.gif) | | FVIRTMAN Admin
![FVIRTMAN](https://2img.net/u/1612/42/45/74/avatars/1-95.jpg)
Nombre de messages : 78 Date d'inscription : 11/11/2005
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Jeu 5 Avr à 3:54 | |
| tu te mélanges entre tes x et tes y. sd1 = Perso.GetPositionX() + Perso.GetSurface()->w; --> sd1 te donne une position x, a laquelle tu ajoutes un width, donc ok. id2 = sd1 + unPnj.GetSurface()->h ici, tu dis que id2, c'est sd1 (donc un x) + un height ?? ça n'a pas de sens ![Smile](https://2img.net/i/fa/i/smiles/icon_smile.gif) Relis toi bien, je te conseille meme d'appeler tes variables sdx sdy... de bien etre rigoureux, et de te méfier des copier/coller auquels on oublie souvent de modifier tout ce qu'il faut... S'il le faut, fait afficher en live les valeurs de toutes tes variables pour voir si elles sont comme tu les attends : tu localiseras vite celle(s) qui partent en vrille... | |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Jeu 5 Avr à 5:57 | |
| Si je ne peux pas ajouter un height à un X, comment faire pour trouver le point inférieur droit? En fait pas mal de choses ne sont pas clair, sur combien d'axes dois-je tester si il y a collision? (pour une collision du coté gauche par exemple) J'ai refait mes variables, mais je crois que je suis complètement HS et qu'il y en a plein qui servent a rien (j'en ai 4 pour les x, 4 pour le y...) Puis je test : if (sdy1 >= sgy2 || sdy1 <= igy2) En théorie, si j'arrive à hauteur de mon perso par l'axe des ordonnees, (donc en allant vers le bas), il devrait y avoir collisions, bah non, j'ai collisions dès le début du prog Est-il possible de me remettre sur le bon chemin et me dire combien de variables j'aurais pour une image, ainsi que comment trouver ses valeurs. Moi je trouve: sgx1 = Perso.GetPositionX(); sgy1 = Perso.GetPositionY(); sdx1 = Perso.GetPositionX() + Perso.GetSurface()->w; igy1 = Perso.GetPositionY() + Perso.GetSurface()->h; id(x ou y ?!)1 = ????? Merci d'avance |
| ![Aller en bas](https://2img.net/i/empty.gif) | | FVIRTMAN Admin
![FVIRTMAN](https://2img.net/u/1612/42/45/74/avatars/1-95.jpg)
Nombre de messages : 78 Date d'inscription : 11/11/2005
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Jeu 5 Avr à 6:10 | |
| Essaie cette fonction (je ne l'ai pas retestée, mais normalement, c'est bon) - Code:
-
int Collide(SDL_Surface* s1,SDL_Surface* s2) { if((s1->x >= s2->x + s2->w) || (s1->x + s1->w <= s2->x) || (s1->y >= s2->y + s2->h) || (s1->y + s1->h <= s2->y) ) return 0; return 1; }
| |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Jeu 5 Avr à 12:54 | |
| Merci pour la fonction! Je récupère juste la condition et j'adapte avec mon code, ca donne ça : - Code:
-
if((Perso.GetSurface()->x >= unPnj.GetSurface()->x + unPnj.GetSurface()->w) || (Perso.GetSurface()->x + Perso.GetSurface()->w <= unPnj.GetSurface()->x) || (Perso.GetSurface()->y >= unPnj.GetSurface()->y + unPnj.GetSurface()->h) || (Perso.GetSurface()->y + Perso.GetSurface()->h <= unPnj.GetSurface()->y) )
Je compile et je me retrouve avec ces erreurs : main.cpp:45: error: 'struct SDL_Surface' has no member named 'x' main.cpp:46: error: 'struct SDL_Surface' has no member named 'y' main.cpp:46: error: 'struct SDL_Surface' has no member named 'y' main.cpp:47: error: 'struct SDL_Surface' has no member named 'y' main.cpp:47: error: 'struct SDL_Surface' has no member named 'y' x et y ne semblent pas exister pour la surface, vu que c'est nous qui définissons les points pour le blitter, donc j'adapte un peu différement mon code et je me sers des accesseurs pour récupérer x et y. J'obtiens cela : - Code:
-
if((Perso.GetPositionX() >= unPnj.GetPositionX() + unPnj.GetSurface()->w) || (Perso.GetPositionX() + Perso.GetSurface()->w <= unPnj.GetPositionX()) || (Perso.GetPositionY() >= unPnj.GetPositionY() + unPnj.GetSurface()->h) || (Perso.GetPositionY() + Perso.GetSurface()->h <= unPnj.GetPositionY())) {}else MessageBox(0,"ok", "ok",0);
Ca compile impec, et je me retrouve encore avec le message qui apparait quand je suis à perpette de mon pnj. Au cas ou ça parait bizarre, en voici la preuve : Que dois-je faire? ![Smile](https://2img.net/i/fa/i/smiles/icon_smile.gif) |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Jeu 5 Avr à 12:56 | |
| Beh, il est passé ou mon lien?? Je le remet ici : |
| ![Aller en bas](https://2img.net/i/empty.gif) | | FVIRTMAN Admin
![FVIRTMAN](https://2img.net/u/1612/42/45/74/avatars/1-95.jpg)
Nombre de messages : 78 Date d'inscription : 11/11/2005
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Ven 6 Avr à 2:06 | |
| lol, c'est pas des SDL_Surface* qu'il faut que je passe, mais des SDL_Rect* - Code:
-
int Collide(SDL_Rect* s1,SDL_Rect* s2) { if((s1->x >= s2->x + s2->w) || (s1->x + s1->w <= s2->x) || (s1->y >= s2->y + s2->h) || (s1->y + s1->h <= s2->y) ) return 0; return 1; }
| |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Ven 6 Avr à 3:37 | |
| Je me sers de vos fonctions Blit, elles s'occupent de déclarer automatiquement un rectangle, donc jusqu'à présent, je n'ai pas eu à m'occuper de cela... Est-il possible de récupérer ce rectangle ? Ou alors je suis obligé d'ajouter à mes classes une variable de type SDL_Rect puis la passer en paramètre dans les fonctions Blit pour ensuite pouvoir tester les collisions ?
Une autre petite question : A quel classe est-il le plus logique d'ajouter la partie de gestion des collisions ? |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Sam 7 Avr à 18:38 | |
| J'arriverai jamais à gérer ces collisions... J'ai modifié mes classes, j'ai ajouté une variable de type SDL_Rect dans chacune d'entre elles. J'ai ensuite fait un accesseur pour pouvoir tester ces valeurs dans mon main. J'ai modifié la fonction Blit pour qu'elle puisse modifier un rectangle (je sais pas si je l'ai fait correctement justement donc je met ici - Code:
-
void Blit(SDL_Rect r,SDL_Surface* source,int x1,int y1,int images_longueur,int images_hauteur,SDL_Surface* dest,int x3,int y3) { r =Rect(x1,y1,source->w/images_longueur,source->h/images_hauteur); SDL_Rect D=Rect(x3,y3,0,0); SDL_Rect* pS=&r; if (x1<0) pS=NULL; SDL_BlitSurface(source,pS,dest,&D); }
Puis pour finir, je teste dans le main : - Code:
-
if((Perso.GetRect().x >= unPnj.GetRect().x + unPnj.GetRect().w) || (Perso.GetRect().x + Perso.GetRect().w <= unPnj.GetRect().x) || (Perso.GetRect().y >= unPnj.GetRect().y + unPnj.GetRect().h) || (Perso.GetRect().y + Perso.GetRect().h <= unPnj.GetRect().y)) {} // je sais que c'est moche, c'est en attendant! else MessageBox(0,"ok","ok",0);
C'est la fonction de dessus, j'ai juste remplacé par mes accesseurs... Bah Ya de nouveau collision dès le début du programme. La va falloir m'expliquer je comprends pu rien du tout... ![silent](https://2img.net/i/fa/i/smiles/icon_silent.png) |
| ![Aller en bas](https://2img.net/i/empty.gif) | | FVIRTMAN Admin
![FVIRTMAN](https://2img.net/u/1612/42/45/74/avatars/1-95.jpg)
Nombre de messages : 78 Date d'inscription : 11/11/2005
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Mar 10 Avr à 1:31 | |
| Tu as une fonction "PrintOGL" qui traine ? un truc qui peut t'écrire du texte en live ? Si c'est le cas, pendant que tu fais bouger ton sprite, fait afficher, en live, toutes ses données x,y,w,h pour chacun des 2 sprites, tu repereras déja si y'a une valeur qui part en vrille, ou alors si ça vient de tes algos de collision. | |
| ![Aller en bas](https://2img.net/i/empty.gif) | | bartours Invité
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! Mar 10 Avr à 4:57 | |
| J'ai utilisé la fonction PrintSDL qui est sur le site! Problème résoluuuuuuuuuuu Ouf j'ai bien pensé que ça ne marcherait jamais! Merci beaucoup pour tout ces conseils, c'est vrai maintenant, ça me semble plutot logique! Du coup j'hésite un peu, est-il plus judicieux d'intégrer cette fonction à la classe personnage ou pnj? Je pense que personnage convient mieux, mais je saurais pas dire pourquoi! |
| ![Aller en bas](https://2img.net/i/empty.gif) | | Contenu sponsorisé
![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | Sujet: Re: Les collisions, besoin d'une grande aide! ![Les collisions, besoin d'une grande aide! Empty](https://2img.net/i/empty.gif) | |
| |
| ![Aller en bas](https://2img.net/i/empty.gif) | | | Les collisions, besoin d'une grande aide! | |
|
Sujets similaires | ![+](https://2img.net/i/empty.gif) |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |