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

Auteur Sujet: Problème avec la fonction draw  (Lu 1830 fois)

0 Membres et 1 Invité sur ce sujet

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Problème avec la fonction draw
« le: Décembre 24, 2013, 03:09:50 pm »
Bonjour à tous :)

Je travaille sur un projet de Tile Mapping (oui je sais c'est pas original xD)
J'essaye que chacune de mes Tiles puissent gérer 3 couches de rendus, (plus facile pour gérer les Collisions de dire que la Tile entière entraîne une collision)

Mes tiles sont contenus dans ma classe Zone, et les Zones sont contenues dans ma classe World

Le World a donc un fonction draw comme ça :

void World::draw()
{
    mApp.setView(mWorldView);
    mActualZone->draw(mApp, Layer::Sol);
        mApp.sf::RenderTarget::draw(mSceneGraph); // mApp est de type Application qui hérite de pas mal de trucs dont plusieurs fonctions draw --> Je sais c'est pas tip-top...
}

Ensuite une zone se dessine comme ça :

void Zone::draw(sf::RenderWindow& window, Layer::ID const& layer) const
{
    for (int i = mZoneBounds.left/32; i < mZoneBounds.left/32 + mZoneBounds.width/32; ++i)
    {
        for (int j = mZoneBounds.top/32; j < mZoneBounds.top/32 + mZoneBounds.height/32; ++j)
        {
            mZone[i][j].draw(window,layer);
        }
    }
}

mZone est un : std::vector<std::vector<Tile>>

Ensuite, vous pouvez le deviner, une Tile se dessine comme ça :

void Tile::draw(sf::RenderWindow& window, Layer::ID const& layer) const
{
    if (layer < Layer::Count)
    {
        window.draw(mSprites[layer]);  /// C'est ici que le debugger marque une erreur
    }
}

Et au cas où, je vous montre ça :

namespace Layer
{
    enum ID
    {
        Sol = 0,
        Mid = 1,
        Top = 2,
        Count = 3,
    };
}

Et quand je défini mSprites (dans Tile), c'est un std::array d'une taille de Layer::Count (3, une case / couche)

Quand je lance un coup de debugger, j'obtient :

#0 68ED3151     sf::RenderTarget::draw(this=0x28fba0, drawable=..., states=...) (D:\developpement\sfml\sfml\src\SFML\Graphics\RenderTarget.cpp:147)
#1 00403FB3     Tile::draw(this=0x0, window=..., layer=@0x28fa2c: Layer::Sol) (C:\ProjetsC++\src\Tile.cpp:21)
#2 00404DB3     Zone::draw(this=0x3ba00e8, window=..., layer=@0x28fa2c: Layer::Sol) (C:\ProjetsC++\src\Zone.cpp:54)
#3 00404589     World::draw(this=0x3b85550) (C:\ProjetsC++\src\World.cpp:17)
#4 00403D82     GameState::draw(this=0x3b85548) (C:\ProjetsC++\src\GameState.cpp:11)
#8 0040155A     Application::Application(this=0x28fb78) (C:\ProjetsC++\src\Application.cpp:12)
#9 00401435     main() (C:\ProjetsC++\main.cpp:5)
 

Voilà, si le problème est connu ou que je suis tout simplement trop bête pour le voir... J'aimerais bien un petit coup de main :)

Edit: Bon j'ai essayé de trouver dans mon coin mais j'ai rien de bien...

Voilà ma nouvelle fonction pour Tile::draw :

void Tile::draw(sf::RenderWindow& window, Layer::ID const& layer) const
{
    if (layer < Layer::Count)
    {
        std::cout << mSprites.at(0).getPosition().x << std::endl; // Nouvelle Ligne de l'erreur...
        window.draw(mSprites.at(0));
    }
}

Maintenant la ligne de l'erreur a changée... Et je n'ai aucune idée de pourquoi l'erreur pourrait venir de cette ligne...

Voilà la déclaration de mSprites : std::array<sf::Sprite,  Layer::Count>   mSprites;

Et voilà son initialisation :

// On crée les sprites en fonction des codes
    for (unsigned int i = 0; i < Layer::Count; ++i)
    {
        mSprites[i].setTexture(mTexture);
        mSprites[i].setPosition(pos);
     mSprites[i].setTextureRect(sf::IntRect(posTexture.x,posTexture.y,32,32));
    }
« Modifié: Décembre 24, 2013, 03:43:22 pm par Cmdu76 »