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

Auteur Sujet: [Résolu] Sf::Image et sf::Texture  (Lu 3412 fois)

0 Membres et 1 Invité sur ce sujet

fayastone

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
[Résolu] Sf::Image et sf::Texture
« le: Décembre 07, 2014, 03:44:15 am »
Bonjour,bonsoir à tous,

Je reprends un projet en sfml 1.6 et essaie de le passer en 2.1 afin de profiter des évolutions effectuées sur la bibliothèque.

Certaines nouvelles implémentations me posent problème dans la mesure où pour seule solution je ne vois souvent qu'une profonde modification du code alors qu'il existe bien souvent des solutions plus simples.

Aujourd'hui, j'ai une petite erreur persistante à propos du constructeur des sprites qui sembles désormais ne se faire qu'avec des textures et plus avec des images.

Ainsi j'avais une classe GraphicElement dérivée de sf::Sprite dont le constructeur que voici :

Citer
GraphicElement::GraphicElement(Image * image, int x, int y, int w, int h)
  :  Sprite(*image), _w(w), _h(h)

Me donne l'erreur suivante :
Citer
error: no matching function for call to 'sf::Sprite::Sprite(sf::Image&)'|

En consultant la doc je vois que les constructeurs de sprites se font avec des textures, ainsi faut-il n'utiliser plus que des sf::textures pour manipuler des sf::sprites depuis des fichiers d'image ? Si oui, quelel est l'utilité de la classe sf::Image ? Sinon, comment faire passer mon sf::image au sf::Sprite ?

Merci de m'avoir lu !

Cordialement, Faya.
« Modifié: Décembre 08, 2014, 12:53:25 am par fayastone »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Sf::Image et sf::Texture
« Réponse #1 le: Décembre 07, 2014, 03:51:33 am »
Les sprites prennent des textures.
Si t'as une image tu la charger dans une texture avec loadFromImage, mais si t'as pas besoin d'image passe directement par une Texture. N'utilise une image que si tu as besoin des fonctions spécifiques à image (getPixel par exemple).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sf::Image et sf::Texture
« Réponse #2 le: Décembre 07, 2014, 09:53:06 am »
Je pense que les tutoriels et la documentation expliquent tout ça très bien. Les as-tu lu en détail ?
Laurent Gomila - SFML developer

fayastone

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : Sf::Image et sf::Texture
« Réponse #3 le: Décembre 07, 2014, 04:12:15 pm »
Merci G. !

Laurent oui je me suis renseigné sur cette page:
http://sfml-dev.org/tutorials/2.0/graphics-sprite-fr.php

+ les documentations de classe.
http://sfml-dev.org/documentation/2.0/classsf_1_1Sprite.php
http://sfml-dev.org/documentation/2.0/classsf_1_1Texture.php

Cependant cet ancien projet avait développé uniquement avec des sf::Image, je ne voyais pas à l'époque l'utilité des textures. Désormais, j'ai le sentiment qu'il ne reste plus que les textures pour l'utilisation que j'en fais (j'ai des images.png dans un dossier, je les charge, les redimensionne en width et height et les affiche sur la window).
Si ce n'est que le nom qui change pas de problème, mais là je vois par exemple la disparition d'une fonction extrêmement utile : le resize d'un sprite en fonction d'un nombre de pixel donné :
Citer
GraphicElement::GraphicElement(Texture * texture, int x, int y, int w, int h)
  :  Sprite(*texture), _w(w), _h(h)
{
  resize(w, h);
  setPosition(x,y);
}

[...]

void GraphicElement::resize(int w, int h){
   _w = w;
   _h = h;
   ///Methode de classe sf::Sprite
   resize(_w, _h);
}

Et l'appel à ces éléments :

Citer
   
 if (!_background_image.loadFromFile("./sprites/planet.png"))
          GraphicElement background_sprite(GraphicElement());
else
         _background_sprite = GraphicElement(&_background_image,0,0,BACKGROUND_WIDTH,h);

Du coup je suis un peu perdu, je ne sais pas si je dois utiliser les sf::Image puisque je veux par exemple faire dessiner des Sprites avec une largeur et hauteur bien définie (par exemple du 40 par 60 en prenant à la base une image entière de 200 par 300) ou si je dois remplacer l'ancienne fonction resize par l'utilisation de scale de la classe Textures.

Je trouve dommage la disparition de cette implémentation. Ceci dit, la nouvelle est sans doute plus logique malheureusement j'ai appris avec l'ancienne   :-\.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Sf::Image et sf::Texture
« Réponse #4 le: Décembre 07, 2014, 06:07:17 pm »
sf::Texture est effectivement le nouveau nom de sf::Image 1.6. Si tu fais ce remplacement, très peu de choses ont finalement changé. Quant à sf::Image, elle a maintenant une toute autre utilité : la manipulation d'images offline (i.e. travailler sur les images, pas les afficher) ; a priori tu peux la laisse de côté et te concentrer sur sf::Texture.

Sprite::Resize n'existe plus, car la même fonctionnalité est déjà disponible avec la fonction setScale (il faut juste calculer taille_voulue / taille_initiale).
« Modifié: Décembre 08, 2014, 07:58:52 am par Laurent »
Laurent Gomila - SFML developer

fayastone

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re : Sf::Image et sf::Texture
« Réponse #5 le: Décembre 08, 2014, 12:52:53 am »
C'est vrai que dans l'absolu; resize découle de scale. Très bien merci de vos réponses :) !