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

Auteur Sujet: [Résolu] Sprite ne s'affiche pas - C++, SFML 2.0  (Lu 5249 fois)

0 Membres et 1 Invité sur ce sujet

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
[Résolu] Sprite ne s'affiche pas - C++, SFML 2.0
« le: Août 20, 2012, 07:51:24 pm »
Bonsoir,
J'ai choisi de passer à Visual Studio pour mes projets C++, j'ai donc suivi le tuto d'installation, et commencé mon projet. L'exemple dans le tuto marche parfaitement, et d'ailleurs un code basique (tout dans main.cpp) affichant un sprite marche aussi très bien, mais si par malheur, je commence à faire des classes (un bouton dans mon cas), là, mon sprite ne s'affiche pas, mais le texte si. Voici mon code :
Button::Button()
{
   if(!tex.loadFromFile("btn.png")) {
      echo("Failed to load texture !", IT_Error);
      exit(-1);
   }

   spr.setTexture(tex);
   spr.setTextureRect(sf::IntRect(0, 0, 350, 60));

   if(!font.loadFromFile("font.png")) {
      echo("Failed to load font", IT_Error);
      exit(-1);
   }
   label.setFont(font);
   label.setCharacterSize(40);
}

Button::Button(sf::String str, float x, float y)
{
   Button();
   label.setString(str);
   move(x, y);
}

void Button::onDraw(sf::RenderWindow *w)
{
   w->draw(spr);
   w->draw(label);
}

void Button::move(float x, float y)
{
   spr.setPosition(x, y);
   label.setPosition(x + (350 - label.getLocalBounds().width) / 2, y + (60 - label.getLocalBounds().height) / 2);
}


Ou echo est un std::cout personalisé et onDraw est appelé quand le bouton doit être dessiné. J'ai essayé de remplacer la texture et le sprite par des pointeurs, mais là, sa crash à la fonction move parce-que le pointeur sur spr est oublié par magie (redevenu 0) ;D J'ai aussi essayé en Release mais rien y fait :-[ !
Que faire ?
Peut-être cela viens-t-il du fait que j'utilise Visual C++ 2012 ?
Merci d'avance pour votre aide, Nicolas.
« Modifié: Août 21, 2012, 03:19:50 pm par BuildLight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #1 le: Août 20, 2012, 08:35:50 pm »
Il faut voir comment tu utilises cette classe. J'ai l'impression que tu as le problème décrit à la fin du tutoriel (1.6) sur les sprites.
Laurent Gomila - SFML developer

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #2 le: Août 20, 2012, 08:41:46 pm »
Oui c'est certainement ça; je vais essayer de faire un gestionnaire d'images.
Sinon le fait d'utiliser la version 2012 ne change rien ?

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #3 le: Août 20, 2012, 09:27:42 pm »
Après avoir fait un gestionnaire de ressources, de nouveau le même problème avec les pointeurs :
Après le retour de la fonction init() que j'ai crée entre temps qui répète les mêmes opérations que Button() un peu plus haut, le programme s'amuse à oublier les pointeurs, mais cette fois à l'intérieur de la SFML :

Exception non gérée à 0x0FBC9075 (sfml-graphics-d-2.dll) dans xxx.exe : 0xC0000005 : Violation d'accès lors de l'écriture à l'emplacement 0x00000000.

Une idée ? Merci.
« Modifié: Août 20, 2012, 09:32:21 pm par BuildLight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #4 le: Août 20, 2012, 09:32:09 pm »
Utilise ton debugger, regarde quelle ligne utilise un pointeur nul, et tu devrais trouver très facilement d'où ça vient.
Laurent Gomila - SFML developer

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #5 le: Août 20, 2012, 09:35:01 pm »
Ah oui, pardon, j'avais oublier de le préciser dans le post précédent, c'est à la ligne :

label.setString(str);

Or, je ne vois aucun pointeur Oo
Merci ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #6 le: Août 20, 2012, 10:07:12 pm »
Citer
Button::Button(sf::String str, float x, float y)
{
   Button();
Cette ligne n'a pas l'effet escompté. En C++ tu ne peux pas appeler un constructeur depuis un autre constructeur. Là tout ce que ça va faire c'est créer une instance de Button temporaire et la détruire aussitôt. Du coup ce que tu penses initialisé, ne l'est pas. Il faut passer par une fonction si tu veux factoriser du code.
Laurent Gomila - SFML developer

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #7 le: Août 20, 2012, 10:12:39 pm »
Oui je l'ai remarqué, c'est pour sa que j'ai crée ma fonction init(), maintenant mon code ressemble à cela :

Button::Button(RessourceManager *rm)
{
   init(rm);
}

Button::Button(RessourceManager *rm, sf::String str, float x, float y)
{
   init(rm);
   label.setString(str);
   move(x, y);
}

void Button::init(RessourceManager *rm)
{
   spr.setTexture(rm->texture(RES_BUTTON));
   spr.setTextureRect(sf::IntRect(0, 0, 350, 60));

   label.setFont(rm->font(RES_FONT));
   label.setCharacterSize(40);
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #8 le: Août 20, 2012, 10:56:28 pm »
Tu as bien tout vérifié avec le debugger ? Que les fonctions texture et font de ResourceManager renvoyaient bien des instances valides ? Que rm n'est pas nul ?
Laurent Gomila - SFML developer

BuildLight

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Sprite ne s'affiche pas - C++, SFML 2.0
« Réponse #9 le: Août 21, 2012, 03:19:09 pm »
Ok, c'est bon, le RessourceManager ne renvoyait pas les textures / fonts valide. J'ai corrigé le problème et mettant les textures et fonts publique, au lieu de passer par une fonction. A la limite, une struct aurait suffit, mais comme ma classe était déjà crée, autant l'utiliser ;) !
Merci !!!