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

Physique Discussion :

Moteur 2D : surface inclinées


Sujet :

Physique

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut Moteur 2D : surface inclinées
    Bonjour,

    Voilà j'ai une petite question qui me taraude.... j'ai fait un petit moteur 2D pour les jeux du type Mario... pour l'instant mes decors sont en fait des carrés de 16x16 : donc pour tester une collision je teste si mon bonome est dans le carré (bounding box simple)

    Ma question : comment faire pour que quand je mets un decor en forme de pente, mon bonome glisse sur cette pente, ou dumoins se deplace comme si il marchait sur une pente ? .... car pour l'instant ca fait escalier....

    Je ne sais pas si je suis clair ? faut il que je revois mon systeme de collisions ?

    merci de votre aide

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Fais une petite recherche sur "pixel perfect collision" (par exemple sur ce forum).

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    merci, c'est donc bien aux niveaux collisions qu'il faut que je revois ce que j'ai fait.

    Par contre, le pixel perfect n'est il pas un peu trop "imposant" pour un simple petit mario : "n'est ce pas tuer une mouche avec un bazooka" ? lol

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pas forcément non. Ce n'est pas si lourd et au moins les résultats sont exacts.

    Et puis sans passer par un travail énorme pour définir des surfaces de collisions plus simples à la main, tu n'as pas trop le choix.

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Une autre méthode ça serait avec l'équation d'une droite; pour chaque objet 2d il faut mémoriser les 2 extrémités de la pente...c'est une autre méthode

    Tu peux te faire un éditeur qui charge l'image, calcule les pixels de collision et détermine la droite de pente.
    Après roulez jeunesse

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    j'ai un peu regardé sur internet et j'ai vu la methode de l'Axe séparateur.
    Pour le peu que j'ai lu elle m'a l'air plutot simple est assez puissante : qu'en pensez vous ?

    merci

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Cet algo est parfait pour ce pour quoi il est conçu : tester l'intersection entre deux polygones convexes. Donc si tu as besoin de ce genre de test alors oui utilise cet algo. Mais perso, je ne vois pas d'où sortiraient ces polygones convexes (à moins que comme je l'ai dit tu les définisses à la main, ce qui est bien fastidieux).

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    exact je n'y avait pas pensé....

    Par contre petite question cette fois sur la reponse à une colision :
    Normalement elle est specifique à l'entité (et pour chq entite elle depend de la collision) : par exemple :
    Le joueur tombe sur un decor => il s'arrete
    Le joueur tombe sur un ennemi => l'ennemi meurt si il a pas de pique sue la tete
    Un ennemi tombe sur un decor => il rebondit
    ....

    Donc ma question : dois je dans chq entité faire un methode : reponse collision (avec la 2 eme entité en parametre) ou faire une classe Collision qui detecte la colision, puis si collision il y a, identifie les 2 entités en cause et fait le traitement adequat ?

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est typiquement le genre de cas qui pose problème. Si tu veux un système vraiment propre (vu de l'extérieur tout du moins), il faudra te pencher sur les méthode de double dispatch (ou multiple dispatch, ou encore multi-méthodes -- plusieurs noms pour la même chose).

    Mais selon le contexte on peut souvent s'en sortir beaucoup plus facilement, par exemple en assignant un "groupe" à chaque entité ("joueur", "ennemis", "décors", ...). Comme ça pas besoin de chercher à connaître le type réel de l'entité avec laquelle on a collisionné, il suffit de récupérer son groupe. Mais je le répète, ça dépend beaucoup de ton application et de sa complexité.

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    bon alors j'opte pour un ptit pixel perfect

    alors j'ai defini en premier lieu des recangle autour de mes objets que je teste avant d'essayer le pixelperfect.. ca ok !

    ensuite mon premier prob : comment recuperer le tableau de pixel de mon image TGA (j'utilise la lib de funto pour charger l'image)...(getData() me renvoie rien)

    Ensuite, imaginons que j'y arrive... je dois, avec ce tableau, là où c'est transparent je mets TRUE et les autres je mets FALSE ? et ce pour chq image "differente" ?


    merci

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    ensuite mon premier prob : comment recuperer le tableau de pixel de mon image TGA (j'utilise la lib de funto pour charger l'image)...(getData() me renvoie rien)
    Aucune idée. C'est quoi cette bibliothèque ?

    Ensuite, imaginons que j'y arrive... je dois, avec ce tableau, là où c'est transparent je mets TRUE et les autres je mets FALSE ? et ce pour chq image "differente" ?
    Oui c'est le principe.

    Tu peux aussi jeter un oeil à la fin de cette discussion :
    http://www.developpez.net/forums/sho....php?p=1121646

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    ok je pense avoir compris


    Mais encore une petite question (ou plutot 2 )

    Dejà imaginons que j'ai 20 images "différentes" qui font chacune 32 x 32 donc à l'initialisation, pour chacune de ces images je devrais parcourir leur tableau et creer mon tableau de booleans... ca risque pas de prendre un peu de temps à l'initialisation ?

    Ensuite : mon bonome se deplace plus ou moins vite... donc entre la position XDep et XFin je dois tester si il ne rentre pas en collision avec un decor (pour pas qu'il passe a travers...).

    pour l'instant j'ai qqchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Pour i = XDep; i<XFin; i++
       if !testerCollision
          avancer à la position i
    Donc ca rique de faire beaucoup de teste ca non ? surtout si je suis avec le pixel perfect....


    D'ailleur je viens de penser a un truc... quand il detexte une collision avec un mur, normalement je replace mon bonome contre le mur...
    1. Peut on connaitre le "vecteur pression" de la collison ?
    2. dois je replacer mon bonome contre le mur, ou legerement à coté ?

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dejà imaginons que j'ai 20 images "différentes" qui font chacune 32 x 32 donc à l'initialisation, pour chacune de ces images je devrais parcourir leur tableau et creer mon tableau de booleans... ca risque pas de prendre un peu de temps à l'initialisation ?
    Pas forcément. De toute façon difficile de trouver plus rapide.

    Donc ca rique de faire beaucoup de teste ca non ? surtout si je suis avec le pixel perfect....
    Oui. Tu peux faire beaucoup moins de tests je pense, pour ça tu peux t'inspirer des méthodes de collision 3D.

    Peut on connaitre le "vecteur pression" de la collison ?
    Qu'est-ce que tu appelles "vecteur pression" ?

    dois je replacer mon bonome contre le mur, ou legerement à coté ?
    Là c'est toi qui voit... Du moment qu'il n'est pas dedans

  14. #14
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    ce que j'appelles "vecteur pression" en fait c'est le vecteur qui donne la direction et la force de l'objet qui rentre dans un autre....
    Par exemple : quand mon bonome saute et quil se cogne la tete sur un decor : il faut que j'arrete de le faire monter et que je le replace juste en dessous du decor... en resumé connaitre si il s'agit d'une collision en haut, en bas, a gauche, a droite.... (par rapport au bonome)

    Ensuite quand je parlais de le replacer c etait si je le replace pile au dessus il va me redecter une collision... mais si je le mets trop haut, la gravité va le faire tomber et hop recollision.... donc mon bonome avancera plus...car yaura tjrs une collision...

    (je sais pas si c'est tres clair ? mais j'essaye de l'être lol )

  15. #15
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    en fait il me faudrait le "vecteur d'intersection" pour déterminer le "sens" de cette collision : par exemple : un joueur tombe : je le replace au dessus du decor. Si le joueur avance vers un decors (avance vers la droite) je le replace au bord gauche du decor.... peut on avoir ces renseignements avec le pixel perfect ?

    merci

  16. #16
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Si tu connais la position du joueur 1 frame avant la collision tu peux en déduire le vecteur collision.

  17. #17
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    ben je connais la position precedente :

    m_Ancx = PosX
    m_PosX = m_PosX + m_vitesseX*dTemps

    j'ai donc la position avant(et apres) le deplacement

  18. #18
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    bonjour,

    Voilà j'ai reussi mon pixel perfect.... mon prob c'est que au debut j'avasi prevu : lorsque que une collision se produit : je replace mon joueur en haut, a droite, en bas ou a gauche du decor en regardant si la boite l'englobant etait en collision avec la boite du decor.... par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    if joueur->collision(Decor)
       // collision haut (par rapport au joueur)
       if (joueur->PosYPrecedente()+joueur->Hauteur() < Decor->PosY())
           joueur->SetPosY(Decor->PosY() - joueur->Hauteur())
    le prob c'est que la position(Decor->PosY() - joueur->Hauteur()) du joueur ne marche plus (dumoins que si le joueur prends toute la boite l'englobant) ... il faudrai que je replace mon joueur, "pile"(au pixel pres) en dessous (au dessus a droite ou à gauche..) du decor...

    sachant que je connais la position avant le deplacement, la position apres le deplacement, la vitesse....

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 16
    Points
    16
    Par défaut
    yop

    bon, je sais pas où tu en es dans ton pixel perfect, mais je te déconseille fortement cette méthode, c'est bien trop gourmand en resources pour un truc aussi simple...

    L'idée de l'équation de droite est encore la plus simple et la plus rapide, et tu peux automatiser la création des équations pour toutes tes tiles.

    pour chaque tile, tu cherche le pixel le plus haut à droite et à gauche et tu aura les deux extrémités de ta droite, il ne reste plus qu'à déterminer l'équation correspondante.

    Ensuite tu utilise cette fonction pour trouver la position verticale de ton personnage sur la tile en fonction de sa position horizontale :

    petit rappel pour l'équation de droite : y = ax + b

    (b) est la hauteur trouvée sur le bord gauche de la tile et (a) est le facteur d'inclinaison

    disons que tu as une tile de 16x16 dont la pente commence à gauche avec y se trouvant à 3 pixels du bas de la tile et le haut de la pente sur le bord droit, à y = 11

    pour trouver (b), c'est simple, c'est la première hauteur, donc 3
    et pour (a), tu fais :

    a = (y de droite - y de gauche) / x de droite
    a = (11-3) / 15
    a = 0.53333

    d'où : y = 0.5333 * x + 3

    avec ça tu peux trouver trés vite la position verticale sur la tile en fonction de la position horizontale, sans avoir à scanner les pixels de ta tile à chaque fois. tu auras juste à associer les valeurs (a) et (b) a chaque type de tile.

    sinon, si tu tiens vraiment à du pixel perfect, tu peux aussi stocker dans un tableau à 16 entrées la hauteur maximale pour chaque x sur la tile, tu auras juste besoin de chopper la valeur dans le tableau, sans faire aucun calcul, mais bon, ça bouffe un poil plus de mémoire.

    sinon, pour ton problème de test de collisions en fonction de la longueur de ton vecteur de déplacement :

    si ton vecteur est plus long qu'une tile, tu fais une boucle qui avance pas à pas depuis ta position de départ vers l'arrivée avec un pas égal à la longueur d'une tile, et dès que tu rencontres une tile pleine tu sais qu'il y a collision avec elle, donc tu peux sortir de la boucle.

    vlà, si jamais un truc t'échappe dans mes explications... j'ajouterais des détails

    a+

Discussions similaires

  1. [2D] nombre de surfaces offscreen dans un moteur 2D
    Par lvdnono dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 03/03/2006, 09h09
  2. Taille des surfaces avec DirectDraw
    Par Shakram dans le forum DirectX
    Réponses: 5
    Dernier message: 09/09/2002, 00h42
  3. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23
  4. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01
  5. Opengl -- Les surfaces
    Par Anonymous dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2002, 10h14

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