begin process at 2012 05 27 13:56:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Jeux

 > BOMBERMAN EN C++ ET SDL, MOTEUR TERMINÉ MAIS A AMÉLIORER, SANS BUGS CONNUS.

BOMBERMAN EN C++ ET SDL, MOTEUR TERMINÉ MAIS A AMÉLIORER, SANS BUGS CONNUS.


 Information sur la source

Note :
Aucune note
Catégorie :Jeux Classé sous :jeux video, bomberman, bomber man, SDL, FMOD Niveau :Initié Date de création :25/10/2008 Date de mise à jour :03/06/2010 05:42:39 Vu / téléchargé :6 479 / 792

Auteur : ionstorm356

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour à toutes et à tous, voici le premier code que j'offre a la communauté et j'espère que sa ne sera pas le dernier :)
Je vous est concocté un petit jeu en 2D, réplique du célèbre Bomberman, sauf que celui là s'appelle Bobyman (très original ^^)
Le code est plutôt bien structuré il me semble, c'est mon premier jeu avec un moteur plus ou moins complet, j'en avait fais pas mal pas complet avant enfaite ^^
Les caractéristiques du jeu :
- Gestion de menus, transitions (entre menu et partie), et de parties (quand vous jouez)
- Une campagne solo, ou vous affronterez des marmottes plutôt énervés, des élémentaires d'eau et de feu (très élémentaires :D)
- Un mode multijoueurs de 2 à 4 joueurs (pas d'IA pour ce mode, à implémenter si sa vous dis, les fonctions sont déjâ crées, plus qu'à les enrichires ;) )
- Les maps de la campagne solo sont chargés à partir de fichiers et les maps multi sont générées aléatoirements.
Il existe 3 mondes différents (seuls les textures et les monstres changent vraiment)
- La difficulté du jeu est plutôt élevé, en solo vous ne disposez que de 3 vies non récupérables et les maps sont riches en monstres :D
- L'IA est assez simpliste mais sa peut vous donnez l'idée de comment sa marche :P
- Vous pouvez éditer vos propres niveaux simplement avec le bloc-note (lisez d'abord le fichier "editor readme.txt" situé dans le dossier "resource\scenario"

Le développement de ce jeu est arrété, il n'avait pas pour objectifs d'être finis, c'était plus pour se poser les bonnes questions à propos de la conception de jeu.

Mais n'hésitez surtout pas à me donner plein de feedbacks et à poser des questions !!!

J'ai compilé sous Codeblocks sous Windows, pour passer sous Linux il doit vraiment pas falloir grand chose. Après si vous voulez changer de compilateur c'est plus délicat parce qu'il faut connaitre les librairies appelées.

Autre chose, les graphismes sont sommaires, le but de ce projet était orienté programmation, donc la campagne solo n'a pas de scénario, les transitions (j'ai quand même mis en place un système de slide qui change au bout d'un temps, on peut mettre plusieurs slides a la suite dans une transition donc) sont le plus concis possible et les graphismes des carreaux composants les cartes sont un peu pompés :P

La version téléchargeable sur ce site est limité aux seules sources, aucune autres ressources. Donc si vous prenez les bibliothèques adéquates (SDL, SDL_Image, FMOD) vous pourrez compilez, mais sans les images le programme risque fort de planter. C'est pourquoi je vous propose aussi de le télécharger directement à cette adresse :
http://gamesangel.free.fr/bobyman/BobyMan_Full.z ip (faites attention il y a un espace en trop, je ne sais pas pourquoi il est rajouté automatiquement mais n'oubliez pas de l'enlever !)
Cette archive contient le jeu complet source + executable + librairie SDL, SDL_Image et FMOD, vous n'avez rien a faire, logiquement vous avez juste a ouvrir le projet (fichier Bomberman.cbp (ouai bomberman :p) ) avec Codeblocks et a appuyer sur F9 pour compiler :)
Ou bien vous pouvez lancer directement les 2 executables, un en fullscreen l'autre en windowed, c'est plus convivial.

Ci-dessous la source de engine.h pour vous mettre l'eau a la bouche (mmmmh xD)

Source

  • #ifndef _ENGINE_
  • #define _ENGINE_
  • /// @brief Classe ENGINE, Le moteur de l'application
  • class ENGINE
  • {
  • private :
  • /// @brief la frame en cours de traitement
  • FRAME* m_fFrame;
  • /// @brief la couleur de fond par defaut
  • SDL_Color m_cBackgroundColor;
  • public :
  • //VARIABLES//
  • /// @brief La largeur de l'ecran
  • INT m_iScreenWidth;
  • /// @brief La hauteur de l'ecran
  • INT m_iScreenHeight;
  • /// @brief La profondeur des couleurs
  • INT m_iColorDepth;
  • /// @brief Mode plein ecran ou fenetre
  • BOOL m_bFullScreen;
  • /// @brief Titre de l'application
  • CHAR* m_pTitle;
  • /// @brief Le tableau contenant les entrees clavier (aussi souris)
  • TOOLS::INPUT m_iInput[323];
  • /// @brief Le temps ecoule entre deux frames
  • INT m_iTimeElapsed;
  • /// @brief Le temps depuis que l'application a ete lancee
  • INT m_iTime;
  • //PARAMETRE DU JEU//
  • /// @brief le nombre de joueur pour une partie multijoueur
  • UINT m_uNumPlayer;
  • /// @brief le nombre de vie restante pour une partie en solo
  • UINT m_uPlayerLife;
  • /// @brief doit on quitter le programme ?
  • BOOL m_bExit;
  • //METHODES//
  • /// @brief Preinitialisation
  • RESULT OneTimeSceneInit();
  • /// @brief Initialisation
  • virtual RESULT Init();
  • /// @brief Gestion des entrees
  • virtual RESULT Input();
  • /// @brief Animation
  • virtual RESULT FrameMove(INT iTimeElapsed);
  • /// @brief Affichage
  • virtual RESULT FrameRender(SDL_Surface* sScreen);
  • /// @brief Destruction
  • virtual RESULT Destroy();
  • /// @brief Obtenir le nombre de joueurs (humains)
  • UINT getPlayerNumber() {return m_uNumPlayer;}
  • /// @brief Obtenir le nombre de vies restantes
  • UINT getPlayerLife() {return m_uPlayerLife;}
  • /// @brief Obtenir la frame en cours de traitement
  • FRAME*& getFrame() {return m_fFrame;}
  • /// @brief Definir le nombre de joueurs (humains)
  • VOID setPlayerNumber(UINT uNumPlayer) {m_uNumPlayer=uNumPlayer;}
  • /// @brief Definir le nombre de vies restantes
  • VOID setPlayerLife(UINT uPlayerLife) {m_uPlayerLife=uPlayerLife;}
  • /// @brief Definir la frame en cours de traitement
  • VOID setFrame(FRAME* fFrame) {m_fFrame=fFrame;}
  • /// @brief Definir si on doit quitter l'application ou pas
  • VOID setExit(BOOL bExit) {m_bExit=bExit;}
  • };
  • #endif
#ifndef _ENGINE_
#define _ENGINE_

/// @brief Classe ENGINE, Le moteur de l'application
class ENGINE
{
    private :

        /// @brief la frame en cours de traitement
        FRAME*          m_fFrame;
        /// @brief la couleur de fond par defaut
        SDL_Color       m_cBackgroundColor;

    public :

        //VARIABLES//
        /// @brief La largeur de l'ecran
        INT     m_iScreenWidth;
        /// @brief La hauteur de l'ecran
        INT     m_iScreenHeight;
        /// @brief La profondeur des couleurs
        INT     m_iColorDepth;
        /// @brief Mode plein ecran ou fenetre
        BOOL    m_bFullScreen;
        /// @brief Titre de l'application
        CHAR*   m_pTitle;
        /// @brief Le tableau contenant les entrees clavier (aussi souris)
        TOOLS::INPUT   m_iInput[323];
        /// @brief Le temps ecoule entre deux frames
        INT     m_iTimeElapsed;
        /// @brief Le temps depuis que l'application a ete lancee
        INT     m_iTime;

        //PARAMETRE DU JEU//
        /// @brief le nombre de joueur pour une partie multijoueur
        UINT            m_uNumPlayer;
        /// @brief le nombre de vie restante pour une partie en solo
        UINT            m_uPlayerLife;

        /// @brief doit on quitter le programme ?
        BOOL m_bExit;

        //METHODES//
        /// @brief Preinitialisation
        RESULT OneTimeSceneInit();
        /// @brief Initialisation
        virtual RESULT Init();
        /// @brief Gestion des entrees
        virtual RESULT Input();
        /// @brief Animation
        virtual RESULT FrameMove(INT iTimeElapsed);
        /// @brief Affichage
        virtual RESULT FrameRender(SDL_Surface* sScreen);
        /// @brief Destruction
        virtual RESULT Destroy();

        /// @brief Obtenir le nombre de joueurs (humains)
        UINT            getPlayerNumber()                                    {return m_uNumPlayer;}
        /// @brief Obtenir le nombre de vies restantes
        UINT            getPlayerLife()                                      {return m_uPlayerLife;}
        /// @brief Obtenir la frame en cours de traitement
        FRAME*&         getFrame()                                           {return m_fFrame;}
        /// @brief Definir le nombre de joueurs (humains)
        VOID            setPlayerNumber(UINT uNumPlayer)                     {m_uNumPlayer=uNumPlayer;}
        /// @brief Definir le nombre de vies restantes
        VOID            setPlayerLife(UINT uPlayerLife)                      {m_uPlayerLife=uPlayerLife;}
        /// @brief Definir la frame en cours de traitement
        VOID            setFrame(FRAME* fFrame)                              {m_fFrame=fFrame;}
        /// @brief Definir si on doit quitter l'application ou pas
        VOID            setExit(BOOL bExit)                                  {m_bExit=bExit;}

};

#endif

 Conclusion

Amusez-vous bien ;)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

03 juin 2010 05:38:30 :
Liens mis à jour
03 juin 2010 05:39:41 :
Liens mis à jour
03 juin 2010 05:41:29 :
Liens mis à jour
03 juin 2010 05:42:39 :
Lien mis à jour

 Sources de la même categorie

Source avec Zip Source avec une capture JEU DES CARTES par eapaceinfo
PROGRAMME DE JEU DE MPT par KerizGarmm
Source avec Zip Source avec une capture JEUX SERPENT par antho974
Source avec Zip Source avec une capture PENDU EN SDL par Damsou91
Source avec Zip STATE MACHINE MODIFICATION MATH BUCKHAM par billybones79

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture BOMBERMAN 4 PLAYERS LAN (C & SDL) par c1702
Source avec Zip Source avec une capture LECTEUR DE MUSIQUE AVEC SDL ET FMOD par Lemng
Source avec une capture JEU DE PENDU AVEC SDL, FMOD ET TTF par bad_dark_spirit
Source avec Zip Source avec une capture TETRIS EN C++ AVEC LA SDL par guitariste2
Source avec une capture [DEV-CPP]UN TETRIS, ENCORE... par maxwells

Commentaires et avis

Commentaire de ionstorm356 le 26/10/2008 03:56:09

Je tient juste à préciser que dans le dossier resource\support vous trouverez la doc de la source (dossier docs) ! ainsi que le diagramme des modules, ce qui peut être très pratique pour comprendre le programme. J'ai aussi laissé le diagramme de Gantt et la présentation qui n'est pas vraiment ce que j'aurai fais si j'avais eu le choix mais il fallait s'aligner sur ce que l'on me demandé de faire.
Le diagramme de Gantt n'est pas tout a fais rigoureux car normalement une tâche ne devrait s'effectuer qu'en une fois à se qu'il parait ^^

Commentaire de ionstorm356 le 27/10/2008 04:06:58

N'hésitez pas à laisser des commentaires (wesh laissez des comms xD) si vous comprenez pas bien quelque chose ou bien simplement pour me dire si ce code vous a aider ou bien pour me dire ce que vous améliorerais non pas au niveau ajout de fonctionnalités au jeu mais plutôt dans le genre, optimisation du moteur ... (etc), si vous trouvez quelque chose d'incohérent qui prend plein de ressources pour rien par exemple ou bien que vous connaissez une meilleur méthode pour faire ceci ou cela, enfin des feedbacks quoi :P

Commentaire de uaip le 27/10/2008 22:50:15

Ca sent le bon gros boulot bien rigoureux ça.
Cahier des charges, power-point de présentation, dragrammes, etc, je dis chapeau.
Vraiment pas mal.
Un défaut par contre, quant à l'exécution du jeu. Quand on joue en mode "windowed" et qu'on déplace la fenêtre, il se peut que certaines marmottes se barrent de leur endroit (je suppose que lors du MOVE de la fenêtre, le calcul des trajets des marmottes continue de se faire, sans évaluer les conditions (cases passables ou pas)).

Commentaire de ionstorm356 le 28/10/2008 02:03:49

Je crois avoir trouver à quoi c'est dû. Le jeu est en temps réel, donc les mouvements sont basés sur le temps et un "dt" est calculé (dt = temps écoulé entre 2 frames), hors quand on déplace la fenêtre, la frame n'est pas mise a jour et le dt devient très grand ce qui fait que quand on réaffiche une frame, le monstre se "téléporte". On peut mettre en évidence ce bug en posant une bombe et en tenant (pas obligé de déplacé) la barre système avec la souris, si vous attendez suffisamment longtemps et que vous relâchez la bombe va exploser instantanément alors que le jeu était pourtant bien en "pause". Enfaite quand on déplace la fenêtre, elle se lance dans une boucle de message informant sur son statut de déplacement et demandant une réactualisation de l'image la ou la fenêtre est en train d'être déplacé (même si vous la déplacer pas le fait de tenir la barre système en cliquant dessus est compté comme si vous déplaciez la fenêtre). Cette réactualisation est indépendante de la SDL et du programme qui sont eux a l'arrêt, c'est pourquoi l'image est figée. Par contre la variable contenant le temps qui est géré par l'OS est extérieur au programme et toujours actualisée (enfin elle l'est a la demande). Se qui fait que quand le programme redémarre on lui demande "quelle heure est-il" (par l'intermediaire de la fonction get_ticks() de sdl qui appelle la fonction de l'OS gerant le temps) et on fait la différence avec l'heure à laquelle la dernière frame a été affiché, c'est à dire juste avant que l'on déplace la fenêtre. Ce qui créé une différence énorme et déplace les monstres super vite, et fais exploser les bombes instantanément, en cherchant bien on peut trouver d'autre bugs similaires. Mais on peut tous les résoudre d'un coup en résolvant le problème du "dt" qui doit se remettre a jour correctement (par exemple en faisant iTime=SDL_GetTicks(); et en recalculant le "dt") juste après que la fenêtre est été déplacé (la SDL doit nous permettre d'avoir cette info) ou bien simplement limité les dt trop grands, exemple si dt>100 then dt=10; m'enfin là c'est un peu bricolé mais utile pour les pc susceptibles de ramer, ce qui est aussi une cause de "dt" trop grands.

C'est bien vu pour le bug je n'avais pas pensé à faire ce genre de test, merci ;)

Commentaire de Nicolas___ le 28/10/2008 17:17:38

Salut ,

ton projet a l'air très intéressant , je me plongerais dans le code plus tard ...
Mais pour l'instant , serais tu mettre l'exécutable dans le zip
(renomme le en .ex pour qu'il passe )
que je puisse testé la bête (j'ai pas envie de réinstaller une nième * SDL et FMOD)  


Merci

Commentaire de Nicolas___ le 28/10/2008 17:19:40

ca m'apprendra à lire la description ^^ autant pour moi !

Commentaire de ionstorm356 le 28/10/2008 17:25:42

Pas de problème ^^
Sinon un autre petit bug, au niveau du déplacement qui arrive très rarement mais pas aléatoirement.
Si on pose une bombe et que l'on se déplace vers un carreau adjacent, en mettant le centre de l'image dans le carreau adjacent mais avec une partie de l'image encore sur la bombe et si on reessaye de se déplacer sur la bombe, le joueur sera automatiquement replacé sur le carreau adjacent étant donné que la bombe est considérée comme un objet où le joueur n'est pas censé aller dessus.
Enfin bon c'est pas se qu'on pourrait appeler un bug majeur, rien qui empeche de jouer normalement m'enfin je le dis quand même ^^

Commentaire de popoldenouvion le 26/06/2010 10:20:14

Oui vraiment un beau travail que je salue.
Une petite remarque concernant le déplacement des monstres dont seule une image apparait alors que dans le programme a bien distingué les positions up down left et right. Et si l'on met 4 images différentes selon la position le programme n'affiche que l'image correspondant à la ligne pDownImageFile ; y a t il quelque chose que je ne vois pas ?

Si un réponse est possible je suis preneur car j'aimerai que selon que le monstre se déplace vers le haut, le bas, à gauche ou à droite une image différente corresponde à chaque sens et puis idem pour le personnage.

Commentaire de ionstorm356 le 27/06/2010 06:12:33

C'était prévu mais je n'avais pas d'images comme je voulais pour le faire enfaite alors j'avais arrêter de coder cette partie par manque de temps mais il n'y a quasi plus rien à faire enfaite :P
Bref niveau code, tu dois juste ajouter une donnée membre de type long à la classe PLAYER, que tu affectera avec la direction du personnage, puis tu devras utiliser cette donnée membre pour choisir la bonne image à afficher.
Donc dans PLAYER::Framemove quand tu reçois l'action m_bActions[UP] tu affecte ta donnée membre à UP, pareil pour DOWN, LEFT et RIGHT. Puis dans Player::FrameRender au moment où tu dois afficher ton perso avec la fonction SDL_BlitSurface tu lui donne comme image m_pCharacters[m_lDirection] avec m_lDirection comme étant ta donnée membre.
Une autre façon de faire serait d'avoir directement un pointeur sur un SDL_Surface indiquant l'image courante à afficher, que tu changeras uniquement quand l'utilisateur change de direction et dans la méthode FrameRender tu n'aura qu'à utiliser ce pointeur qui sera toujours censé être valide.
Dans les deux cas si tu implémente ça dans la classe PLAYER ça marchera pour le joueur humain et l'ia.

A autre chose qui ne devrait pas poser problème mais qui est quand même une erreur (de copier coller :P), fichier user.cpp, ligne 99 à 102 je définie la couleur clé pour chaque image (haut, bas ...) sauf qu'à chaque fois je passe en paramètre le format de l'image UP alors que je devrais passer le format de l'image correspondante : pour UP le format de l'image correspondant à UP, pour DOWN le format de l'image correspondant à DOWN...
Le même problème est présent dans ai.cpp ...

Désolé mais à l'époque je ne maitrisais pas très bien les fonctions virtuelles, c'est pour ça qu'il y a un peu de copier coller par-ci par-là.

Bonne chance pour la suite ;)

Commentaire de popoldenouvion le 27/06/2010 16:19:16

Bonjour et Merci pour une réponse si rapide ; j'avoue que je pensais que je n'aurai peut-être pas deréponse vu la date des commentaires précédents mais je tiens à vous remercier très sincèrement et je vais étudier vos conseils et essayer de les mettre en pratique car je suis novice dans ce domaine et j'avoue qu'il y des lignes que j'ai du mal à analyser.
Dans le dossier de votre programme il y avait un lien (adresse) pour vous contacter ; est-elle encore valable et pourrais-je éventuellemnt vous contacter pour d'autres renseignements ?

Bien cordialement.

JPM

Commentaire de popoldenouvion le 28/06/2010 17:32:40

Je ne dispose pas de skype ; j'ai essaye de suivre vos conseils mais n'y arrive pas. J'ai réussi à faire l'animation pour les monstre en mettant des if dans le Framerender et cela fonctionne très bien pour les monstres mais alors je n'ai plus l'image de boby .
Si cela est possible et si votre temps le permet, pourriez-vous me communiquer ce qu'il faudrait que je tape concrétement pour réaliser ce que vous conseillez et me dire aussi à quel endroit le saisir. D'avance je vous remercie ; mon adresse mail est : popoldenouvion@wanadoo.fr
Si votre temps ne le permet pas je comprendrais très bien. Je vous remercie encore pour votre coopération et vous renouvelle mes félicitations.

Commentaire de ionstorm356 le 28/06/2010 21:47:15

C'est pas vraiment une question de temps mais plus d'idéologie dans ce cas là, je ne mâche pas le travail, programmer c'est beaucoup de réflexion, si vous voulez évoluer il faudra le faire par vous même après si vous avez des questions à propos de quelque chose que vous n'avez pas compris sur mon code je suis toujours là ;)

Commentaire de popoldenouvion le 20/07/2010 14:27:49

J'ai réussi à différencier les images selon que les personnages (joueurs, monstres, ...)vont en haut en bas, à droite ou à gauche.
J'aimerai ajouter une animation selon chaque direction et ma question est ou serait-il le plus judicieux de placer les lignes de programmes pour ces animations. animation du style de marche des personnages selon la direction et animation des yeux ou autres .... à voir selon la faisabilité et animation par exemple des bombes dont la mêche allumé diminue avec le temps ; les flammes semblent bouger et changer de couleur ....
Avec des exemples concrets comme celui-ci on arrive plus facilement à évoluer et j'en profite pour remercier une nouvelle fois l'auteur de cet exemple qui m'a beaucoup servi.
Cordialement.
JPM

Commentaire de xristamati le 21/01/2011 18:37:11

hello to all! this programm seems very interesting! I would like to know if anyone of you managed to open the file frame.cpp because I try to read it and unfortunatelly I see only one line of code :( I would appreciate it if someone could send me the code of this file.

Thanks! Good work

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Fmod et dev-cpp 4.9.9.2 [ par kujad ] Bonjour, je vais être clair : FMUSIC_StopSong(zik);     SDL_Quit;        return 0;quand je comp problème avec SDL, struct? [ par foxley ] Bonjour, je suis nouveau ici.J'ai un projet en C à faire pour la fac.Et à vrai dire je suis bloqué a un endroit:"tab[i]->surface-&gt probleme de compilation SDL [ par darmoor ] Je suis dsl , le sujet doit etre souvent demandé mais j'ai deja cherché sur google et j'ai pas encore trouvé ce qu'il faut. Bon alors Longueur d'un sample de Fmod en secondes [ par Marceleeuuh ] Salut je voudrais savoir comment il est possible de calculer la longueur, la durée, d'un sample de FMOD. Je recupere la valeur grace à la Problemes OpenGl avec SDL [ par ToNtOnYoYo ] bonjour bonjour... voila mon prob.. j'essaye d'afficher une simple ligne nooire ds ma fenetre ( créé avec SDL) et ca ne marche pas .. je SDL semble ne pas fonctionner ? [ par neodelphi ] Bonjour tout le monde ! Voila mon problème : je suis en train d'essayer de faire de l'openGl avec la sdl sous un système linux. Après a Durée totale d'un FMUSIC (FMOD) [ par Marceleeuuh ] Salut quelqu'un sait-il comment récupérer la longueur d'un module (FMUSIC) avec FMOD? J'ai cherché mais pas moyen de trouver une foncti Probleme initialisation SDL sous windows (dev -cpp) [ par happy1 ] Bonjour, Voila je veux initialiser SDL avec dev-c++ voici le code: #include "SDL.h" #include "stdio.h" #include "stdlib.h" int main() {  &nbs SDL ou ALLEGRO ? [ par vincelefou ] Bonjour, J’ai une question à vous posez sur les bibliothèques graphiques ( -> c’est pour faire une petite appli en 2D avec Dev Comment on fait pour utiliser la SDL avec GTK+ ?? [ par Rouliann ] Bonjour tout le monde! Malgré mes nombreuses recherches sur le web, je n'ai trouvé aucune information concernant une possible utilisation de


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales