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

Auteur Sujet: Faire bouger une TileMap  (Lu 2481 fois)

0 Membres et 1 Invité sur ce sujet

mites

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Faire bouger une TileMap
« le: Novembre 18, 2013, 01:28:50 pm »
Voila, je tente d'utiliser le tutoriel pour afficher une TileMap à l'écran, j'ai reussi à le faire fonctionner, cependant je suis incapable de créer un mouvement "fluide" pixel par pixel et non tuile par tuile.
J'utilise la fonction load que j'ai un peu modifiée :
bool TileMap::load(const std::string& tileset, sf::Vector2u tileSize, unsigned char** level, unsigned int height, unsigned int width,int dx, int dy)
    {
        // on charge la texture du tileset
        if (!m_tileset.loadFromFile(tileset))
            return false;

        // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
        m_vertices.setPrimitiveType(sf::Quads);
        m_vertices.resize((height) * (width) * 4);//nombre de tiles de haut * nb tiles de large * nombre de points par tiles.

        // on remplit le tableau de vertex, avec un quad par tuile
        for (unsigned int j = 0; j < height; ++j)
            for (unsigned int i = 0; i < width; ++i)
            {
                // on récupère le numéro de tuile courant
                int tileNumber = level[height-j-1-(dy/PPB)][i+(dx/PPB)];//on inverse l'axe des Y(j),de cette manière on obtient que la coordonnées 0,0 est le coin en bas à gauche, c'est plus pratique.

                // on en déduit sa position dans la texture du tileset
                int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);

                // on récupère un pointeur vers le quad à définir dans le tableau de vertex
                sf::Vertex* quad = &m_vertices[(i + j * width) * 4];

                // on définit ses quatre coins
                quad[0].position = sf::Vector2f((i * tileSize.x)+dx%PPB, (j * tileSize.y));// coin haut gauche
                quad[1].position = sf::Vector2f(((i + 1) * tileSize.x)+dx%PPB, (j * tileSize.y));//coin haut droit
                quad[2].position = sf::Vector2f(((i + 1) * tileSize.x)+dx%PPB, ((j + 1) * tileSize.y));//coin bas droit
                quad[3].position = sf::Vector2f((i * tileSize.x)+dx%PPB, ((j + 1) * tileSize.y));//coin bas gauche

                // on définit ses quatre coordonnées de texture
                quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y); // coin haut gauche
                quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);//coin haut droit
                quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);//coin bas droit
                quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);//coin bas gauche
            }
        return true;
    }
 
J'ai entre autre, rajouté des argument dx et dy qui servent à bouger l'image.
Cependant, j'ai un problème, quand j'essaye d'ajouter un mouvement horizontal, les tuiles les plus à gauches (dont les points les plus à gauche sont en dehors de l'écran) ne s'affichent pas.
J'ai rajouté dx/PPB (pixel par bloc) pour charger les bonnes tuiles.
et je les déplace le tout de dx%PPB pixel vers la droite(en ajoutant dx%PPB à leurs coordonnées)
Du coup j'ai une barre noire de taille dx%PPB à gauche de mon écran.
Si j'enlève 32 pixel à toutes mes coordonnées le problème reste le même.
J'ai l'impression qu'on ne peut pas afficher des choses trop à gauche de l'écran.edit(il n'aime peut-être pas les coordonnées négatives)
« Modifié: Novembre 18, 2013, 01:30:50 pm par mites »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Faire bouger une TileMap
« Réponse #1 le: Novembre 18, 2013, 01:36:13 pm »
Tu t'y prends très mal :P

Si tu veux déplacer ta tilemap il ne faut surtout pas la recréer à chaque fois ! Il suffit de lui adjoindre la transformation qui va bien (cf. le tutoriel). Voire carrément utiliser une vue (cf. le tutoriel) si c'est le point de vue que tu veux déplacer.
Laurent Gomila - SFML developer

mites

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Faire bouger une TileMap
« Réponse #2 le: Novembre 18, 2013, 01:43:10 pm »
En fait j'ai une tilemap de 500 case de haut et 1200 case de longt(tableau d'unsigned char) et, si j'ai bien compris avec load, j'en charge (dans mon cas) 1600/32(width) de longt et 900/32(height) de haut, je n'ai pas l'impression de recréer ma map, mais il faut bien que je dessine les cases que j'affiche sur ma fenêtre non?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Faire bouger une TileMap
« Réponse #3 le: Novembre 18, 2013, 02:40:08 pm »
Mais pourquoi est-ce que tu fais ça ? Charge tes 500x1200 tiles dans un gros vertex array, que tu dessineras avec "window.draw(matilemap);", et si tu veux déplacer quelque chose cf. mon post précédent.
Laurent Gomila - SFML developer

mites

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Faire bouger une TileMap
« Réponse #4 le: Novembre 18, 2013, 03:43:06 pm »
Ok je vais essayer de faire ça, c'est juste que ca me faisait peur je pense de charger un truc aussi enorme, je vais essayer de refaire ca et d'utiliser view.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Faire bouger une TileMap
« Réponse #5 le: Novembre 18, 2013, 03:47:22 pm »
C'est loin d'être énorme. Pense aux millions de triangles que peut gérer ta carte graphique quand tu joues à un jeu commercial en 3D.

Et même si c'était trop lent à dessiner, il y aurait d'autres techniques simples que tu pourrais greffer à cela pour améliorer les performances.
Laurent Gomila - SFML developer