Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Snitteur le Juin 15, 2014, 02:51:42 pm

Titre: [résolu]Tile map
Posté par: Snitteur le Juin 15, 2014, 02:51:42 pm
Bonjour, je viens de me remettre a coder et je rencontre actuellement un problème de code :

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <stdlib.h>
int LARGEUR_TILE;
int HAUTEUR_TILE;
int main()
{
    sf::RenderWindow World(sf::VideoMode(600, 600), "tilemap");

sf::Texture myTexture;
myTexture.loadFromFile("ressource/tuiles.png");

sf::Sprite mySprite(myTexture);
mySprite.setTextureRect(sf::IntRect(80,0,40,40));

 int map[16][8]
    {
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
        1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
        0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
        0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
        0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
        2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
    };

sf::Sprite tuile0;
tuile0 = mySprite;

///BOUCLE///////////////////////////////
    while (World.isOpen())
    {
        sf::Event event;
        while (World.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                World.close();
        }
World.clear();
for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 2; j++)
    {
        //selon le code trouve dans le tableau on parametre le bon tile et on le colle sur l'ecran
        switch(map[i][j])
        {
            case 0:
            tuile0.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile0);
            break;
        }
    }
}
World.display();
    }
}
 
 


Une fois exécuter ( pas d’erreurs ) je n'ai que sa :

Titre: Re : Tile map
Posté par: G. le Juin 15, 2014, 03:38:38 pm
Faut chercher un peu quand même.
Et surtout initialiser tes variables avant de t'en servir. ;)
Titre: Re : Tile map
Posté par: Snitteur le Juin 15, 2014, 03:51:02 pm
Je cherche sur le net depuis ce matin et je ne comprend toujours pas comment assigner un sprite ( tuile ) a un chiffre comme le "0" du tableau.

J'implore donc de l'aide.  Vous n’êtes pas obliger de m'aider mais j'en serais très ravie
Titre: Re : Tile map
Posté par: Develog le Juin 15, 2014, 04:36:10 pm
Pour t'illustrer comment cela se passe il faut prendre un morceau de papier et un crayon, tu comprendras mieux ;)
Mais par exemple si dans ton tableau tu as un 0 alors ton sprite prend la texture prévu pour le 0
Titre: Re : Tile map
Posté par: Snitteur le Juin 15, 2014, 08:09:39 pm
Bon sa fonctionne mais il j'ai des bug, certaine texture corresponde pas. De plus j'ai cette phrase
après un build :
      =>            c:/.........   warning: missing braces around initializer for 'int [8]' (-Wmissing-braces)

PS voici le code ( je le met pas en balise c++ ) car c'est quasi le même que le 1er et sa ferais un post sasser long

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <stdlib.h>
int LARGEUR_TILE = 30;
int HAUTEUR_TILE = 30;
int main()
{
    sf::RenderWindow World(sf::VideoMode(600, 600), "tilemap");

sf::Texture myTexture;
    myTexture.loadFromFile("ressource/tuiles.png");

 int map[16][8]
    {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
        1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
        0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
        0, 1, 1, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 0, 0,
        0, 0, 1, 0, 1, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
        2, 0, 1, 0, 2, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    }; <= L'erreur ce situ ici



///BOUCLE///////////////////////////////
    while (World.isOpen())
    {
        sf::Event event;
        while (World.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                World.close();
        }

World.clear();
///tuile 0 : rouge
    sf::Sprite mySprite(myTexture);
    mySprite.setTextureRect(sf::IntRect(0,0,40,40));
    sf::Sprite tuile0;
    tuile0 = mySprite;
///tuile 1 : Maron
    sf::Sprite mySprite1(myTexture);
    mySprite1.setTextureRect(sf::IntRect(40,0,40,40));
    sf::Sprite tuile1;
    tuile1 = mySprite1;
///tuile 2 : Bleu
    sf::Sprite mySprite2(myTexture);
    mySprite2.setTextureRect(sf::IntRect(80,0,40,40));
    sf::Sprite tuile2;
    tuile2 = mySprite2;








for(int i = 0; i < 13; i++)
{
    for(int j = 0; j < 7; j++)
    {
        ///selon le code trouve dans le tableau on parametre le bon tile et on le colle sur l'ecran
        switch(map[i][j])
        {
            case 0:
            tuile0.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile0);
            break;
            case 1:
            tuile1.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile1);
            break;
            case 2:
            tuile2.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile2);
            break;



        }
    }
}

World.display();
    }
}

j'espère avoir de l’aide.
Titre: Re : Re : Tile map
Posté par: G. le Juin 15, 2014, 09:12:40 pm
J'implore donc de l'aide.  Vous n’êtes pas obliger de m'aider mais j'en serais très ravie
C'est ce que je faisais en te disant d'initialiser tes variables. ;) En rejetant un coup d'oeil on voit vite que LARGEUR_TILE  et HAUTEUR_TILE n'étaient pas initialisées.

map c'est un tableau de tableaux, t'initialises un tableau avec { blabla }, donc un tableau de tableaux c'est { { blabla1}, { blabla2 } }
int a[3][4] = {  
 {0, 1, 2, 3},
 {4, 5, 6, 7},
 {8, 9, 10, 11}
};
Mais c'est pas obligatoire.
Et du coup, je suis pas sûr que ton tableau se remplisse réellement comme tu le penses.
map[0] c'est 0, 0, 0, 0, 0, 0, 0, 0
map[1] c'est 0, 0, 0, 2, 2, 2, 2, 2
16 tableaux de 8 entiers, et pas 8 tableaux de 16 entiers.
Ça peut expliquer ton problème de textures qui ne correspondent pas. Donc faut arranger ça autrement.

Et sinon à quoi servent tes mySprite ? Tu peux faire ça directement avec tes variables tuile. :o
Titre: Re : Tile map
Posté par: Snitteur le Juin 15, 2014, 09:57:45 pm
Bon je viens d'apprendre un truc merci beaucoup. Maintenant si j’enlève le "map" mon switch ne marche plus et je ne sais pas comment remplir les "cases",  car je ne comprend pas trop le tuto sfml 2.0.
Titre: Re : Tile map
Posté par: Snitteur le Juin 16, 2014, 10:10:45 am
Problème résolut