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 :

[RPG 2D en SDL] Map.


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut [RPG 2D en SDL] Map.
    Bonjour a tous , et à toutes.

    Je suis débutant en C++ , et je développe actuellement un RPG 2D avec la librairie SDL pour mon entrainement personnel.

    je m'aide pour cela d'un tuto trouvé sur le web et intitulé : Réaliser un RPG en C avec SDL et FMOD/Les cartes


    Je sais pas par ou commencer pour coder le chargement d'une map,l'affichage.
    Je ne comprend pas la "logique" à utilisé .

    J'ai créer une class Map , comprenant mes prototypes de mes fonctions , map aléatoire, affichage, chargement, sauvegarde.

    Je cherche tout d'abord à coder la fonction aléatoire qui généra une carte aléatoire a partir d'une image regroupant tout les tiles a utilisé.

    Avez vous des conseils pour m'orienter dans ma démarche . Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Si j'ai bien compris le peu que j'ai lu du tuto, ici on n'a pas besoin que la carte "veule dire quelque chose" : Pour l'instant, c'est juste pour avoir quelque chose à afficher, sauvegarder, charger etc.

    Pour en générer une, c'est généralement assez simple: Tu dois avoir quelque part une map Id de Tile --> Bitmap de Tile, et dans la carte on met uniquement les Ids de Tiles.
    Donc, un truc simple:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Créer une carte vide de dimensions données
    Pour chaque colonne x
    	Pour chaque ligne y
    		Générer un Id de tile au hasard
    		Le mettre à la case (x, y) de la carte
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ouais enfin ça risque pas de faire une map terrible, étant donné que y'a des tiles sur lesquelles tu peux marcher et d'autres pas.
    En plus, entre une tuile "sable" et une tuile "herbe" tu devrais avoir une tuile "sable/herbe".

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    merci de vos réponses, mais concrètement j'organise cela comment?
    le site est en C ,or moi j'utilise du C++ j'ai donc créer une classe map et une structure chipset

    Ensuite dans ma fonction si j'ai bien comprit, je dois utiliser une boucle for ,qui a chaque tile attribue un numéro.

    Pour chaque colonne x
    Pour chaque ligne y
    Générer un Id de tile au hasard,Le mettre à la case (x, y) de la carte
    Pour ce faire je dois "découper" les tuiles de mon Bitmap de Tile c'est bien ça?

    Pour l'instant je suis a la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Map::aleatoire( int width, int height, char *chipset)
    {
        int i,x,y;
        surf_chipset =SDL_LoadBMP(chipset);
        /* Couleur transparente pour l'image */
        SDL_SetColorKey(surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(surf_chipset->format,8,33,82));

  5. #5
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    Pour ce faire je dois "découper" les tuiles de mon Bitmap de Tile c'est bien ça?
    Je pense que oui, car tu ne peux le faire de façons automatique. Comment ton programme va savoir s'il s'agit d'eau, de sable, de dalles... ou encore si la tuile est un mur ou pas?

    Tu dois donc le faire à la main. En indiquant pour chaque tuile :
    - son numéro de tuile
    - Les coordonnées de la tuile sur le chipset
    - si c'est un mur ou pas

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    j'ai essayer ceci mais ca plante... quand je le lance ds le jeu.

    map.h

    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
    class Map {
     
        public:
     
    Map();
    ~Map();
     
     
        void editeur();
        void initialisation();
        void affichage();
        void aleatoire( int width, int height, char *chipset);
        void chargementTiles();
        void chargementMap(char *nom_map);
     
        private :
     
     
     
       unsigned int n_tile;       /* nombre de tiles dont est composé la carte */
       char *chipset; /* tableau des tiles (allocation dynamique) */
       SDL_Surface *surf_chipset; /* pointeur vers la surface contenant le chipset */
     
       unsigned int width;        /* largeur de la carte */
       unsigned int height;       /* hauteur de la carte */
       unsigned int *data;        /* pointeur vers la carte (allocation dynamique) */
     
       unsigned int offsetX;      /* décalage sur l'axe X lors de l'affichage de la carte */
       unsigned int offsetY;      /* décalage sur l'axe Y lors de l'affichage de la carte */
     
    };
     
     
     
    struct s_chipset
    {
      /* coordonnée du tile dans le chipset */
      unsigned int x;
      unsigned int y;
     
     
      unsigned char collision;
     
      /* indique le numéro du prochain tile dans l'animation
         ou -1 si le tile n'est pas animé.
      */
      int nextTile;
     
     
    };
    map.cpp
    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
    #include "map.h"
     
    #include "constantes.h"
    #include <string>
    using namespace std;
     
    Map::Map() :width(0),height(0),offsetX(0),offsetY(0),surf_chipset(NULL)
    {
     
     
    }
    Map::~Map()
    {
       SDL_FreeSurface(surf_chipset);
        free(data);
        free(chipset);
    }
     
     
    void Map::aleatoire( int width, int height, char *chipset)
    {
     
     
     
     
        int i,x,y;
        surf_chipset =SDL_LoadBMP(chipset);
        /* Couleur transparente pour l'image */
        SDL_SetColorKey(surf_chipset, SDL_SRCCOLORKEY, SDL_MapRGB(surf_chipset->format,8,33,82));
     
    n_tile=(surf_chipset->w/TILE_WIDTH)*(surf_chipset->h/TILE_HEIGHT);
    struct s_chipset tableau[i];
    for (i=0;i<n_tile;i++)
    {
    tableau[i].x=x;
    tableau[i].y=y;
    tableau[i].collision=0;
    tableau[i].nextTile=0;
     
    x += TILE_WIDTH;
    if (x>(surf_chipset->w-TILE_WIDTH))
    {
     
        x=0;
        y+= TILE_HEIGHT;
    }
     
     
    }
     
    width=width;
    height=height;
     
    data =(unsigned int*) malloc(width*height*sizeof(unsigned int));
     
         for(x=0;x<width;x++)
            for(y=0;y<height;y++)
               data[x+y*width]=rand()%(n_tile);
     
    }
    main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.aleatoire(100,100,"tiles\\mchip0.bmp");

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    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 540
    Par défaut
    Citation Envoyé par maxtor3569 Voir le message
    Pour ce faire je dois "découper" les tuiles de mon Bitmap de Tile c'est bien ça?
    Un tirage aléatoire pour générer une carte ne s'uilise jamais dans des jeux sinon ça fait quelque chose de bizarre et moche...
    sauf par exemple si tu as des séries similaires comme des tuiles représentant l'herbe d'autres représentant le sable..
    Il faut que tu te fasses obligatoirement un éditeur pour positionner les tuiles...

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    C99, c'est pour le C uniquement, les VLA n'existent pas en C++98 (mais pour C++0x, je ne sais pas).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [SDL] Probleme de map
    Par Pierra26 dans le forum SDL
    Réponses: 2
    Dernier message: 04/06/2009, 23h17
  2. [C#/SDL] Projet RPG 2D HxH
    Par deadstar62 dans le forum Projets
    Réponses: 6
    Dernier message: 11/02/2009, 01h04
  3. [SDL] Quadrillage d'une map
    Par Skymaster dans le forum SDL
    Réponses: 3
    Dernier message: 23/06/2007, 16h37
  4. Projet jeu RPG/moteur 3D isométrique avec SDL
    Par Milan111 dans le forum Projets
    Réponses: 4
    Dernier message: 13/04/2006, 22h01
  5. Réponses: 9
    Dernier message: 04/10/2005, 19h26

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