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

SDL Discussion :

Rotation hitbox


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Rotation hitbox
    Bonjour,

    Je développe un petit jeu avec SDL2 et j'ai un petit souci de hitbox sur certains de mes objets en 3D isométriques.
    Par exemple sur cette capture on voit en noir la hitbox du Space ship (un SDL_Rect) qui ne correspond pas au sprite :
    Nom : SDL_hitbox.png
Affichages : 402
Taille : 132,3 Ko

    J'ai lu qu'il n'était pas possible nativement de tourner un SDL_Rect. Du coup je me demandais si il existe une méthode simple pour avoir une hitbox rectangulaire mais avec un angle (définir les points manuellement peut-être ?).
    Ou si quelqu'un à une autre méthode pour arriver à avoir une hitbox qui colle à mes sprites ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    c'est certain qu'un rectangle on commence à le tourner c'est plus un rectangle simple notion de géométrie de première...
    et pourquoi-pas utiliser des cercles ?

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Alors la SDL n'a pas pour but de gérer les hitbox , le SDL_Rect , alors ça date mais à ma connaissance la SDL ne renvoie pas le w/h sur cette structure.
    (et celle que tu lui envoie est pour le découpage de ton sprite).

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    SDL_Rect c'est (x,y) du coin haut gauche, largeur et hauteur.
    SDL de base est pas vraiment pour faire autre chose que de la simple 2D, et non isométrique.
    Soit tu crées ta propre boundingbox avec un losange (ou hexagone ou ce que tu veux), soit tu aggrandis ton rectangle actuel pour englober tout, soit tu vis avec le fait que quelques pixels ne collide pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par Mat.M Voir le message
    c'est certain qu'un rectangle on commence à le tourner c'est plus un rectangle simple notion de géométrie de première...
    et pourquoi-pas utiliser des cercles ?
    Un cercle ça ferait pas l'affaire, mais une ellipse oui. Par contre j'imagine que c'est plus complexe pour calculer les collisions derrière...

    Citation Envoyé par Kannagi Voir le message
    Alors la SDL n'a pas pour but de gérer les hitbox , le SDL_Rect , alors ça date mais à ma connaissance la SDL ne renvoie pas le w/h sur cette structure.
    (et celle que tu lui envoie est pour le découpage de ton sprite).
    Non on a bien le w et h sur le SDL_Rect (en plus du x et y). D'ailleurs j'utilise la fonction SDL_HasIntersection pour vérifier si il y a collision entre mon personnage et un élément et ça fonctionne bien comme ça

    Citation Envoyé par Bousk Voir le message
    SDL_Rect c'est (x,y) du coin haut gauche, largeur et hauteur.
    SDL de base est pas vraiment pour faire autre chose que de la simple 2D, et non isométrique.
    Soit tu crées ta propre boundingbox avec un losange (ou hexagone ou ce que tu veux), soit tu aggrandis ton rectangle actuel pour englober tout, soit tu vis avec le fait que quelques pixels ne collide pas.
    Quand tu dis créer ma propre boundingbox, ce serait avec SDL en définissant des points spécifiques suivant la forme de mon sprite ?

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Me suis mal exprimé ,je parlais de la texture que la SDL renvoie , mais ok peut etre qu'il renvoie un SDK_rect.

    Sinon comme dit Bousk :
    soit tu vis avec le fait que quelques pixels ne collide pas.
    C'est plus courant qu'on n'imagine d'avoir une hitbox spécifique qui ne représente pas du tout le sprite.
    Du coup pour ma part ,la hitbox est complètement indépendant de l'affichage ou de la taille du sprite.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Me suis mal exprimé ,je parlais de la texture que la SDL renvoie , mais ok peut etre qu'il renvoie un SDK_rect.

    Sinon comme dit Bousk :

    C'est plus courant qu'on n'imagine d'avoir une hitbox spécifique qui ne représente pas du tout le sprite.
    Du coup pour ma part ,la hitbox est complètement indépendant de l'affichage ou de la taille du sprite.
    En fait dans mon cas j'ai 2 SDL_Rect : un pour la texture (qui colle parfaitement au sprite du coup) et un autre qui me sert de hitbox (c'est pour ça que dans ma capture le rectangle ne colle pas à l'image : c'est voulu pour garder l'effet 3D iso).
    Mais mon souci vient de l'angle du space ship qui ne s'adapte pas à un rectangle même d'une taille inférieure au sprite.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Du coup je pense que je vais partir sur un découpage en plusieurs hitbox pour coller au plus près de mon sprite.
    Comme indiqué dans ce tuto, définir un Vector de SDL_Rect qui contiendra les différentes hitbox : https://loka.developpez.com/tutoriel...llision/#LXI-2

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Emmanuel.Jacques Voir le message
    Quand tu dis créer ma propre boundingbox, ce serait avec SDL en définissant des points spécifiques suivant la forme de mon sprite ?
    c'est la solution que j'ai adoptée avec mon propre éditeur de niveaux.
    Ce que je fais c'est que j'utilise 4 coordonnées soit 8 points après il faut déterminer si un point est inscrit dans le polygone décrit par ces points.
    S'il y a collision alors agir ou pas.

    Nom : collisions_2d.jpg
Affichages : 316
Taille : 97,6 Ko

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut


    Ca peut être une solution alternative aux hitbox multiples que j'envisage. Je me demande lequel est le plus performant des deux
    Est-ce que tu as suivit un tuto pour mettre ça en place ou tu aurais un bout de code exemple pour que je vois comment faire ça ?

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    bonjour Emmanuel non je n'ai pas suvi de tuto j'ai tout fait par moi-même comme le boulanger fait sa propre pâte
    En fait je triche un peu en créant un "tilemap" avec l'API win32 CreatePolygonRgn mais ça doit être possible de faire la même chose sous Linux

    Le code n'est pas optimisé il est brut un peu de décoffrage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    void CEntityManager::CreateTileMap()
    {
    	RECT rectSrc;
    	HRGN hRgn1=NULL;
    	HRGN hRgn2=NULL;
    	HRGN hRgnResult=NULL;
    	POINT RGNPoints[4];
    	int x,y,n;
    	int j;
    	int index;
    	int nVal;
    	sBaseObject *pObject=NULL;
    	int i=0;
    	index=0;
     
    	int nOffset=256;
     
    	for(n=0;n<m_vecBaseOBjects.size();n++)
    	{
    		pObject=m_vecBaseOBjects[n];
    		if(pObject->nLayer>=2)
    		{
    			for(j=0;j<4;j++)
    			{
    				RGNPoints[j].x=pObject->nPosX+pObject->ptCollisionEdges[j].x; 
    				RGNPoints[j].y=pObject->nPosY+pObject->ptCollisionEdges[j].y;
    			}
    			hRgn2=::CreatePolygonRgn(RGNPoints, sizeof(RGNPoints)/sizeof(POINT),WINDING);
    			index=0;
    			for(y=0;y<MAX_TILES;y++)
    			{
    					for(x=0;x<MAX_TILES;x++)
    					{
    						rectSrc.left =x * TILE_SIZE;
    						rectSrc.top =y * TILE_SIZE;
     
    					rectSrc.right =rectSrc.left+TILE_SIZE;
    						rectSrc.bottom =rectSrc.top +TILE_SIZE;
    						hRgn1=::CreateRectRgn (rectSrc.left ,rectSrc.top,rectSrc.right,rectSrc.bottom);
    						hRgnResult = CreateRectRgn( 0, 0, 10, 10 );// bidon NE SURTOUT PAS MODIFIER
    						nVal=::CombineRgn(hRgnResult,hRgn1,hRgn2,RGN_AND);
    						::DeleteObject( hRgnResult );
    						::DeleteObject( hRgn1 );
    						if(nVal!=0)
    						{
    							if(nVal!=NULLREGION)
    							{
     
     
    								rectSrc.left =x * TILE_SIZE;
    								rectSrc.top =y * TILE_SIZE;
     
    								rectSrc.right =rectSrc.left+TILE_SIZE;
    								rectSrc.bottom =rectSrc.top +TILE_SIZE;
    								g_vecExclRectangles.push_back (rectSrc);																
    							//++	m_vecExclRectangles.push_back (rectSrc);
     
    							}
    						}
    						index++;
    					}
    			}
    			::DeleteObject( hRgn2 );
     
    		}
     
    	}
    }
    Après il y le problème du Pathfinding bonne chance

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ok merci pour le bout de code, je vais étudier ça plus tard en détails

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Du coup j'ai testé avec une double hitbox comme ça :
    Nom : SDL_hitbox2.png
Affichages : 308
Taille : 106,0 Ko

    Ça me suffit amplement pour le moment et me semble plus simple que de recréer une hitbox sur mesure vu mes besoins

  14. #14
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    salut Emmanuel c'est une bonne chose le revers de la médaille c'est que des parties de l'objet dessiné ne seront pas contenues dans le ou les rectangles.

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je suis un peu étonné de ne pas avoir vu la mention des Object Oriented Bounding Box (ou Object Oriented Boxes), qui garde la notion de rectangle, tout en lui ajoutant un angle. Évidemment, cela complique les calculs (un peu), mais cela pourrait mieux correspondre à votre besoin.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Citation Envoyé par Mat.M Voir le message
    salut Emmanuel c'est une bonne chose le revers de la médaille c'est que des parties de l'objet dessiné ne seront pas contenues dans le ou les rectangles.
    Oui en effet, mais comme je l'ai dit ça suffit pour mes besoins pour le moment

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Je suis un peu étonné de ne pas avoir vu la mention des Object Oriented Bounding Box (ou Object Oriented Boxes), qui garde la notion de rectangle, tout en lui ajoutant un angle. Évidemment, cela complique les calculs (un peu), mais cela pourrait mieux correspondre à votre besoin.
    Je ne connais pas du tout. C'est une libraire externe qui permet de faire ça ou c'est juste une autre manière d'utiliser la SDL pour les collisions ?

  17. #17
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Euh . Ma proposition est bas niveau, dans le sens, indépendante d'une bibliothèque, indépendante du langage. C'est juste une technique (comme un algorithme) qui existe.
    Du coup, pour ce qui est de votre problème, ma solution est a implémenter par vous même. La SDL ne propose pas cela. Par contre, un moteur de jeux vidéo, ou une bibliothèque plus haut niveau, pourrait proposer cela.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ok merci pour ces infos

  19. #19
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Emmanuel.Jacques Voir le message
    Je ne connais pas du tout. C'est une libraire externe qui permet de faire ça ou c'est juste une autre manière d'utiliser la SDL pour les collisions ?
    rien à voir avec ds bibliothèques externes c'est des théorèmes mathématiques et de géométrie.
    Je pense que Littlewhite veut dire que si on prend les 4 côtés du rectangle bref x0,0 x1,y1 x2,y2 et x3,y3 il faut calculer leur transformation avec les fonctions cosinus et sinus selon un angle donné...
    c'est effectivement coûteux en calculs

Discussions similaires

  1. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38
  2. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 15h11
  3. Rotation d'un bouton ?
    Par ken_survivant dans le forum Composants
    Réponses: 3
    Dernier message: 01/04/2003, 18h16
  4. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 17h59
  5. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58

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