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 :

[C]Editeur de map qui déconne


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut [C]Editeur de map qui déconne
    Salut à tous,

    Je suis en train de réaliser un petit éditeur de map style RPGMaker (pour ceux qui connaissent)
    Il fonctionnait plutot bien jusqu'au moment ou j'ai voulu ajouté un systeme de "couches" (plusieurs objets empilables les un sur les autres, ex: sol>>table>>assiete), pour ce faire, j'ai rajouté une 3eme dimension a mon tableau qui contient la map (les 2 premieres dimensions sont les coordonnees x et y)

    Mais maintenant, lorsque je positionne un "tile" (morceau du chipset), toute la map est remplie par celui-ci alors que ce n'etait pas le cas avant.
    J'ai beau cherché, je n'arrive pas a résoudre le problème (je pense à une boucle foireuse mais je ne trouve pas :/)

    Si une âme charitable (ou plusieurs) pouvait m'aider à localiser le probleme

    merci d'avance.

    ps: si en meme temps, vous trouvez des optimisations possibles, n'hésitez pas à m'en faire part

  2. #2
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    à la limite si tu pouvais poster le bout de code que tu suspecte ainsi que la façon dont tu as declarer ton tableau ainsi que les moments où tu entres les tiles, affiches, etc...

    merci

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    pas de probleme,

    voici la déclaration du tableau tridimensionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SDL_Surface *cellule[16][16][3];
    /**/
    for(boucle_x=0; boucle_x<16; boucle_x++)
            for(boucle_y=0; boucle_y<16; boucle_y++)
                        for(boucle_z=0; boucle_z<3; boucle_z++)
                cellule[boucle_x][boucle_y][boucle_z] = defaut;
    /* defaut est une surface par defaut, juste pour remplir le tableau */
    la déclaration du tableau bidimensionnel pour les coordonnees:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SDL_Rect pos_cellule[16][16];
    /**/
    for(boucle_x=0; boucle_x<16; boucle_x++)
            for(boucle_y=0; boucle_y<16; boucle_y++)
            {
                pos_cellule[boucle_x][boucle_y].x = 256 + 2 + boucle_x*32;
                pos_cellule[boucle_x][boucle_y].y = boucle_y*32;
                pos_cellule[boucle_x][boucle_y].w = 32;
                pos_cellule[boucle_x][boucle_y].h = 32;
            }
    l'action lorsque l'on clique sur une case:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    else if(event.button.x > 258 && event.button.x < 770) /* +2px pour la separation */
                        {
                            x = (event.button.x - event.button.x%32 - 254)/32;
                            y = event.button.y/32;
                            SDL_BlitSurface(chipset, &pos_selection_tile, cellule[x][y][z], NULL);
                        }
    et enfin, les boucles qui sont sensées afficher la map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if(couche == 0)
                {
                    for(boucle_x=0; boucle_x<16; boucle_x++)
                        for(boucle_y=0; boucle_y<16; boucle_y++)
                            SDL_BlitSurface(cellule[boucle_x][boucle_y][z], NULL, ecran, &pos_cellule[boucle_x][boucle_y]);
                }
                else
                {
                   for(boucle_x=0; boucle_x<16; boucle_x++)
                        for(boucle_y=0; boucle_y<16; boucle_y++)
                            for(boucle_z=0; boucle_z<couche; boucle_z++)
                                SDL_BlitSurface(cellule[boucle_x][boucle_y][boucle_z], NULL, ecran, &pos_cellule[boucle_x][boucle_y]);
                }
    (la variable couche correspond à coordonnee Z, j'ai fait une variable pour ca parceque plus tard je ferait un systeme pour switcher entre les couches)

  4. #4
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    un petit truc pour plus de clartée déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(boucle_x=0; boucle_x<16; boucle_x++)
            for(boucle_y=0; boucle_y<16; boucle_y++)
              for(boucle_z=0; boucle_z<3; boucle_z++)
                cellule[boucle_x][boucle_y][boucle_z] = defaut;
    remplace le boucle_x pour la 3em dimension par boucle_z par exemple.

    enfin je ne pense pas que ce soit le probleme, mais ça peut eviter bien des deboires par la suite

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Tu veux dire qu'il faut que j'intervertisse X et Z comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(z...)
        for(y...)
            for(x...)
                cellule[z][y][x]...
    ?

  6. #6
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    non non ^^
    juste sur ta derniere boucle, tu utilises boucle_x alors que tu l'utilise déjà dans la premiere.

    ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(boucle_x=0; boucle_x<16; boucle_x++)
            for(boucle_y=0; boucle_y<16; boucle_y++)
              for(boucle_x=0; boucle_x<3; boucle_x++)
                cellule[boucle_x][boucle_y][boucle_x] = defaut;
    la derniere boucle, tu remplaces boucle_x par boucle_z (ainsi que pour la 3em dimension de ton tableau)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    oups, oui effectivement, je me suis gourré en faisant le copier coller parceque j'ai bidouillé un peu pour que ce soit plus clair mais c'est bien boucle_z qui est dans ma source

  8. #8
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    c'est ce que je pensais mais comme on sait jamais :p

    samedi je vais essayer ta source pour mieux voir le probleme, je te tiens au courant

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    J'ai trouvé la solution !
    ca venait de la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    defaut = IMG_Load("images/defaut.bmp");
    /***/
    for(boucle_x=0; boucle_x<16; boucle_x++)
            for(boucle_y=0; boucle_y<16; boucle_y++)
    		    for(boucle_z=0; boucle_z<3; boucle_z++)
                    cellule[boucle_x][boucle_y][boucle_z] = defaut;
    toutes les cases avaient la meme adresse et etaient donc toutes "liées" entre elles, j'ai remplacé le defaut; par IMG_Load("images/defaut.bmp"); et ca tourne au poil

    Merci beaucoup pour ton aide loka

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Prendre plutot stl::vector plutot qu'un tableau à 3 dimensions.
    C'est un peu chi.... à gérer un tableau à 3 dimensions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class calque { SDL_SURFACE m_surface;
    int m_nIndice;
     
    };
    std::vector<calques> liste_calques;

  11. #11
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    content que tu ai pu resoudre ton probleme

    Pour la remarque de Mat.M, en effet vector est en effet plus approprié pour ce genre d'applications, même si moi aussi je reste attaché aux tableau a n dimensions ^^ (l'hebitude d'voir beaucoup programmer sans connaitre STL...)

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    mat.M>> Je ne connait pas du tout les vectors, pourrais-tu me montrer le fonctionnement ou me passer un lien l'expliquant (google trouve pleins de choses mais rien qui me convient)
    merci

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par orochimaru
    mat.M>> Je ne connait pas du tout les vectors, pourrais-tu me montrer le fonctionnement ou me passer un lien l'expliquant (google trouve pleins de choses mais rien qui me convient)
    merci
    C'était une suggestion au cas ou il y aurait bcp de layers...

    Il y a ce tutoriel très complet mais il n'est pas évident à prendre en main
    http://www.developpez.biz/download/stl.pdf

    Sinon sur le forum C++ c'est souvent abordé ; std::vector n'est ni plus ni moins qu'un tableau dynamique.
    Pour ajouter un élément il faut utiliser push_back , pour y accéder il suffit d'avoir l'indice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::vector<calques> liste_calques; 
     
    calque _calque;
    liste_calques.push_back(_calque);
    //.....
    int i;
    int indice;
    for (i=0;i<liste_calques.size();i++)
    indice=liste_calques[i].m_nIndice;
    Ne pas oublier d'effacer les éléments à la fin de l'application

    Sinon il y aussi les listes std::list, les queues std::queue

Discussions similaires

  1. Editeur de texte qui fait la sélection par colonne
    Par wodel dans le forum Windows XP
    Réponses: 5
    Dernier message: 10/11/2010, 13h45
  2. [Manipulation IMG] - editeur de map et chipsets
    Par spyk dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 31/03/2006, 21h01
  3. Editeur de MAP en delphi pour jeux directX
    Par PetitScorpion dans le forum DirectX
    Réponses: 5
    Dernier message: 09/07/2002, 18h47

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