Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Faire défiler une map faite en Tilemapping indéfiniment.  (Lu 1357 fois)

0 Membres et 1 Invité sur ce sujet

Vidou

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
Faire défiler une map faite en Tilemapping indéfiniment.
« le: Octobre 21, 2016, 08:36:07 am »
Bonjour.
Voici plusieurs jours que je m'arrache les cheveux pour faire défiler une map que j'ai créé, en continue (quand on arrive à la fin on affiche la colonne des premières tiles...
Voici l'image de ma map :



voici le code qui me l'affiche jusqu'à la fin mais après impossible d'afficher la 1ere colonne et la suivante après la colonne finale....

void Map::miseAJourMapLevel() // Procédure "miseAJourMapLevel" de la classe Map.
{
        sf::Vertex *quad; // Créé un pointeur vers un objet Vertex de nom "quad".
        int numeroTile(0), coordTileX(0), coordTileY(0), X(0), posX(getPositionInt().x), posY(getPositionInt().y); // Créé des variables de type entier et de noms "numeroTile", "coordTileX", "coordTileY", et "X", tous les 4 de valeur initiale "0".

        if (posX < LONGUEUR_FENETRE - longueurTile * nbTilesLongueurMonde)
                posX = 0;

        minX = (posX / longueurTile) - 1; // Exécute l'opération : '(valeur de type entier de la position en X sur l'écran, divisé par la valeur de type entier positif court de nom "longueurTile") - 1', et enregistre le résultat dans la variable de type entier et de nom "minX".
        minY = (posY / hauteurTile) + 1; // Exécute l'opération : ' (valeur de type entier de la position en Y sur l'écran, divisé par la valeur de type entier positif court de nom "hauteurTile") - 1', et enregistre le résultat dans la variable de type entier et de nom "minY".

        if (minY < 0) // Si la variable de type entier et de nom "minY" est inférieure à 0, alors :
                minY *= -1; // Multiplie la valeur de la variable de type entier et de nom "minY" par -1 pour inverser la polarité de la valeur de la variable "minY".
        else // Sinon, si la variable de type entier et de nom "minY" est supérieure à 0, alors :
                minY = 0; // La variable de type entier et de nom "minY", prends pour valeur "0".

        maxX = ((LONGUEUR_FENETRE - 1 - posX) / longueurTile) + 1; // Exécute l'operation : '(constante de préprocesseur LONGUEUR_FENETRE (valeur contenue dans "define.h") - 1 (car la 1ère valeur est X = 0 : (pour une définition d'écran de 1080X700, il y à des pixels de "X = 0 à 1079, et Y = 0 à 699")), - (valeur de type entier de la position en X sur l'écran, divisé par la valeur de type entier positif court de nom "longueurTile") + 1', et l'enregistre dans la variable de type entier de nom "maxX".
        maxY = ((HAUTEUR_FENETRE - 1 - posY) / hauteurTile) + 1; // Exécute l'operation : '(constante de préprocesseur HAUTEUR_FENETRE (valeur contenue dans "define.h") - 1 (car la 1ère valeur est Y = 0 : (pour une définition d'écran de 1080X700, il y à des pixels de "X = 0 à 1079, et Y = 0 à 699")), - (valeur de type entier de la position en Y sur l'écran, divisé par la valeur de type entier positif court de nom "hauteurTile") + 1', et l'enregistre dans la variable de type entier de nom "maxY".

        for (int Z(0); Z < nbCalques; Z++) // Créé une variable de type entier (int) et de nom "Z" ayant pour valeur initiale "0" et lui impose cette condition : pour (for) "Z" = "0", tant que "Z" est inférieur (<) à la valeur de la variable de type entier (int) et de nom "nbCalques", ajoute + 1 à la variable "Z" après chaque boucle effectué et exécute le code suivant :
        {
                for (int i(minX); i < maxX; i++) // Créé une variable de type entier (int) et de nom "i" ayant pour valeur initiale la valeur de la variable de type entier et de nom "minX" et lui impose cette condition : pour (for) "i" = valeur de la variable de nom "minX", tant que "i" est inférieur (<) à la valeur de la variable de type entier (int) et de nom "maxX", ajoute + 1 à la variable "i" après chaque boucle effectué et exécute le code suivant :
                {
                        for (int Y(minY); Y < maxY; Y++) // Créé une variable de type entier(int) et de nom "Y" ayant pour valeur initiale la valeur de la variable de type entier et de nom "minY" et lui impose cette condition : pour (for) "Y" = valeur de la variable de nom "minY", tant que "Y" est inférieur(<) à la valeur de la variable de type entier(int) et de nom "maxY", ajoute + 1 à la variable "Y" après chaque boucle effectué et exécute le code suivant :
                        {
                                if (i < 0 ) // Si la variable de type entier et de nom "i" à pour valeur une valeur inférieure à "0", alors :
                                {
                                        X = 0; // La variable de type entier et de nom "X" prends pour valeur "0".
                                        numeroTile = 166; // La variable de type entier et de nom "numeroTile" prends pour valeur "166" (correspond à une brique dans le jeu).
                                }
                                else if (i > nbTilesLongueurMonde - 1) // Sinon, si la variable de type entier et de nom "i" à pour valeur une valeur supérieure à la variable de type entier positif court de nom "nbTilesLongueurMonde" à laquelle on enleve 1 (-1), alors :
                                {
                                        X = nbTilesLongueurMonde - 1; // Soustrait 1 (-1) à la variable de type entier positif court de nom "nbTilesLongueurMonde", et entre la valeur dans la variable de type entier et de nom "X".
                                        numeroTile = mapArray(X, Y, Z); // Récupère le n° de tile dans le tableau virtuel de nom "mapArray" contenant le niveau avec le n° des tiles en position "{X,Y,Z}", et stocke ce numéro dans la variable de type entier et de nom "numeroTile".
                                }
                                else // Sinon, si la variable "i" est comprise entre "0" et la valeur de la variable de type entier positif court et de nom "nbTilesLongueurMonde" - 1, alors exécute le code suivant :
                                {
                                        X = i; // La variable de type entier et de nom "X" prends pour valeur la valeur de la variable de type entier et de nom "i".
                                        numeroTile = mapArray(X, Y, Z); // Récupère le n° de tile dans le tableau virtuel de nom "mapArray" contenant le niveau avec le n° des tiles en position "{X,Y,Z}", et stocke ce numéro dans la variable de type entier et de nom "numeroTile".
                                }

                                // on en déduit sa position dans la texture du tileset
                                coordTileX = numeroTile % nbTilesX; // Obtiens la position du n° de tile en X - 1 (car débute à 0) et l'enregistre dans la variable de type entier et de nom "coordTileX".
                                coordTileY = numeroTile / nbTilesX; // Obtiens la position du n° de tile en Y - 1 (car débute à 0) et l'enregistre dans la variable de type entier et de nom "coordTileY".

                                if ((((Z * maxX * maxY) + (X + Y * maxX)) * 4) < nbTilesLongueurMonde * nbTilesHauteurMonde * nbCalques * 4)
                                {
                                        quad = &m_vertices[((Z * maxX * maxY) + (X + Y * maxX)) * 4]; // Récupère l'adresse du Vertex de type Quad à afficher, dans le tableau de Vertex de nom "m_vertices" (de type quad), et l'enregistre dans le pointeur de type Vertex de nom "quad".

                                        //// on définit les quatre coins du quad à afficher :
                                        quad[0].position = sf::Vector2f(X * fLongueurTile, Y * fHauteurTile); // Correspond à faire : m_vertices[((Z * maxX * maxY) + (X + Y * maxX)) * 4].position = sf::Vector2f(X * fLongueurTile, Y * fHauteurTile). Cette instruction définit le coin supérieur gauche de la tile à afficher et lui affecte une position sur l'écran. Par exemple : ((Z * maxX * maxY) + (X + Y * maxX)) * 4) = 0, X = 0 et Y = 0, alors l'operation "X * fLongueurTile, Y * fHauteurTile" sera elle aussi = à 0 (donc le coin gauche superieur haut de l'écran ([X;Y] = [0;0]).
                                        quad[1].position = sf::Vector2f((X + 1) * fLongueurTile, Y * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) +( X + Y * maxX)) * 4) + 1].position = sf::Vector2f((X + 1) * fLongueurTile, Y * fHauteurTile). Cette instruction définit le coin supérieur droit de la tile à afficher et lui affecte une position sur l'écran. Par exemple : ((((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 1) = 1, X = 0 et Y = 0, alors l'operation "((X + 1) * fLongueurTile, Y * fHauteurTile)" sera égale à 1 fois la valeur de la variable "fLongueurTile" pour la valeur en x, et 0 pour y (donc le coin gauche haut de l'écran + "fLongueurTile" pixels (= 1 tile) ([X;Y] = [fLongueurTile;0]).
                                        quad[2].position = sf::Vector2f((X + 1) * fLongueurTile, (Y + 1) * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) +( X + Y * maxX)) * 4) + 2].position = sf::Vector2f((X + 1) * fLongueurTile, (Y + 1) * fHauteurTile). Cette instruction définit le coin inférieur gauche de la tile à afficher et lui affecte une position sur l'écran. Par exemple : ((((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 2) = 2, X = 0 et Y = 0, alors l'operation "((X + 1) * fLongueurTile, (Y + 1) * fHauteurTile)" sera égale à 1 fois la valeur de la variable "fLongueurTile" pour la valeur en x, et 1 fois la valeur de la variable "fHauteurTile" pour y (donc le coin gauche haut, plus "fLongueur" pixels, moins "fHauteur" pixels de l'écran ([X;Y] = [fLongueurTile;fHauteurTile]).
                                        quad[3].position = sf::Vector2f(X * fLongueurTile, (Y + 1) * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) +( X + Y * maxX)) * 4) + 3].position = sf::Vector2f(X * fLongueurTile, (Y + 1) * fHauteurTile). Cette instruction définit le coin inférieur droit de la tile à afficher et lui affecte une position sur l'écran. Par exemple : ((((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 3) = 3, X = 0 et Y = 0, alors l'operation "(X * fLongueurTile, (Y + 1) * fHauteurTile)" sera égale à 0 pour x et 1 fois la valeur de la variable "fHauteurTile" pour y (donc le coin gauche haut, moins "fHauteur" pixels de l'écran ([X;Y] = [0;fHauteurTile]).

                                        // on définit les quatre coordonnées de texture du quad à afficher (présentes dans l'objet Texture de nom "textureTileset")
                                        quad[0].texCoords = sf::Vector2f(coordTileX * fLongueurTile, coordTileY * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) + (X + Y * maxX)) * 4].texCoords = sf::Vector2f(coordTileX * fLongueurTile, coordTileY * fHauteurTile). Permet de définir sur l'image contenant les tiles "textureTileset" (cf. Procédure "draw" en fin de page), l'angle supérieur gauche de la tile que l'on désire afficher. *1
                                        quad[1].texCoords = sf::Vector2f((coordTileX + 1) * fLongueurTile, coordTileY * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 1].texCoords = sf::Vector2f((coordTileX + 1) * fLongueurTile, coordTileY * fHauteurTile). Permet de définir sur l'image contenant les tiles "textureTileset" (cf. Procédure "draw" en fin de page), l'angle supérieur droit de la tile que l'on désire afficher. *2
                                        quad[2].texCoords = sf::Vector2f((coordTileX + 1) * fLongueurTile, (coordTileY + 1) * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 2].texCoords = sf::Vector2f((coordTileX + 1) * fLongueurTile, (coordTileY + 1) * fHauteurTile). Permet de définir sur l'image contenant les tiles "textureTileset" (cf. Procédure "draw" en fin de page), l'angle inférieur droit de la tile que l'on désire afficher. *3
                                        quad[3].texCoords = sf::Vector2f(coordTileX * fLongueurTile, (coordTileY + 1) * fHauteurTile); // Correspond à faire : m_vertices[(((Z * maxX * maxY) + (X + Y * maxX)) * 4) + 3].texCoords = sf::Vector2f(coordTileX * fLongueurTile, (coordTileY + 1) * fHauteurTile). Permet de définir sur l'image contenant les tiles "textureTileset" (cf. Procédure "draw" en fin de page), l'angle inférieur gauche de la tile que l'on désire afficher. *4
                                }
                                else
                                {
                                        exit(-9);
                                }
                        }
                }
        }
}

par avance merci de votre aide.