Virtual FMAN forum
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Virtual FMAN forum

Virtual FMAN forum
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
-22%
Le deal à ne pas rater :
Acer Nitro QG241YM3BMIIPX – Ecran PC Gaming 23,8″ Full HD
139.99 € 179.99 €
Voir le deal

 

 Les collisions, besoin d'une grande aide!

Aller en bas 
AuteurMessage
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyMar 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!
Revenir en haut Aller en bas
FVIRTMAN
Admin
FVIRTMAN


Nombre de messages : 78
Date d'inscription : 11/11/2005

Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyJeu 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

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...
Revenir en haut Aller en bas
http://perso.numericable.fr/fvirtman
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyJeu 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 silent

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
Revenir en haut Aller en bas
FVIRTMAN
Admin
FVIRTMAN


Nombre de messages : 78
Date d'inscription : 11/11/2005

Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyJeu 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;
}
Revenir en haut Aller en bas
http://perso.numericable.fr/fvirtman
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyJeu 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
Revenir en haut Aller en bas
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyJeu 5 Avr à 12:56

Beh, il est passé ou mon lien??
Je le remet ici :
Revenir en haut Aller en bas
FVIRTMAN
Admin
FVIRTMAN


Nombre de messages : 78
Date d'inscription : 11/11/2005

Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyVen 6 Avr à 2:06

lol, c'est pas des SDL_Surface* qu'il faut que je passe, mais des SDL_Rect* Smile

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;
}
Revenir en haut Aller en bas
http://perso.numericable.fr/fvirtman
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyVen 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 ?
Revenir en haut Aller en bas
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptySam 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 Smile

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
Revenir en haut Aller en bas
FVIRTMAN
Admin
FVIRTMAN


Nombre de messages : 78
Date d'inscription : 11/11/2005

Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyMar 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.
Revenir en haut Aller en bas
http://perso.numericable.fr/fvirtman
bartours
Invité




Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! EmptyMar 10 Avr à 4:57

J'ai utilisé la fonction PrintSDL qui est sur le site!

Very Happy
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!
Revenir en haut Aller en bas
Contenu sponsorisé





Les collisions, besoin d'une grande aide! Empty
MessageSujet: Re: Les collisions, besoin d'une grande aide!   Les collisions, besoin d'une grande aide! Empty

Revenir en haut Aller en bas
 
Les collisions, besoin d'une grande aide!
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Un tutorial sur les collisions
» Scrolling==> demande d'aide!

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Virtual FMAN forum :: Tutorial C++ :: SDL-
Sauter vers:  
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser