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

Auteur Sujet: [SFML2.0] Image/Texture/Sprite  (Lu 2557 fois)

0 Membres et 1 Invité sur ce sujet

Ultima

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
[SFML2.0] Image/Texture/Sprite
« le: Octobre 13, 2012, 07:53:43 pm »
Bonjour !

Mon titre est assez vague car j'ai quelques questions concernant les 3 thèmes du titre :

Première question ou plutôt problème, j'ai créer une classe Personnage et lorsque j'essaie de l'afficher dans mon main, un rectangle blanc s'affiche, voici le code de ma classe Personnage :

Personnage::Personnage(const string &filePath, sf::IntRect subRect, sf::Vector2f position)
{
    if(!myImage.loadFromFile(filePath))
    {
        cout << "erreur" << endl;
    }
    else
    {
        // l'image est correctement chargée
        myImage.createMaskFromColor(sf::Color(255,0,255));
        sf::Texture mySprite1;
        mySprite1.loadFromImage(myImage);

        for(int i=0 ; i<4 ; i++)
        {
            mySprite[i].setTexture(mySprite1);
            mySprite[i].setTextureRect(sf::IntRect(30*i, 0, 30, 40));
        }

        spriteActuel = mySprite[0];

    }
}

sf::Sprite Personnage::getSprite()
{
    return spriteActuel; //même problème en faisant return mySprite[0];
}
 

ainsi que mon appel de fonction : window.draw(perso.getSprite());

J'ai encore beaucoup de mal avec les pointeurs donc le problème vient probablement de là (puisque qu'en créant l'objet dans le main sans passer par un constructeur, avec le même code, ça marche)


Deuxième question, est on obligé de passer par une Texture pour passer d'une Image à un Sprite ?
        sf::Texture mySprite1;
        mySprite1.loadFromImage(myImage);


Merci d'avance pour avoir pris le temps de me répondre :)
« Modifié: Octobre 14, 2012, 04:46:42 pm par Ultima »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.0] Image/Texture/Sprite
« Réponse #1 le: Octobre 13, 2012, 10:56:03 pm »
Ta texture est locale à la fonction, et donc détruite dès que celle-ci se termine. Le sprite pointe au final sur une zone mémoire invalide.

Citer
Deuxième question, est on obligé de passer par une Texture pour passer d'une Image à un Sprite ?
Oui.
Laurent Gomila - SFML developer

Ultima

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SFML2.0] Image/Texture/Sprite
« Réponse #2 le: Octobre 14, 2012, 10:58:50 am »
Merci pour ta réponse, mais alors comment faire pour garder l'image en mémoire autrement qu'en la déclarant dans le main ? C'est une histoire de pointeurs ? (Si c'est le cas, je retourne les re[...]travailler de suite)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.0] Image/Texture/Sprite
« Réponse #3 le: Octobre 14, 2012, 11:38:27 am »
Citer
Merci pour ta réponse, mais alors comment faire pour garder l'image en mémoire autrement qu'en la déclarant dans le main ?
Il suffit de la gérer de la même façon que le sprite (puisque leur durée de vie doit être la même), donc tu peux la mettre en membre de la classe Personnage.

Certains aiment aussi utiliser un ImageManager (cf. le wiki), ça simplifie les choses mais personnellement je ne suis pas fan.
Laurent Gomila - SFML developer

Ultima

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [Résolu][SFML2.0] Image/Texture/Sprite
« Réponse #4 le: Octobre 14, 2012, 12:14:51 pm »
Encore merci :)

Edit :
J'ai donc ajouter l'attribut myImage dans ma classe, j'ai mis une méthode getImage() qui me renvoie l'image et que je traite dans le main, ça marche parfaitement. Mais toujours le même résultat pour le getSprite()

main.cpp
#include "Personnage.h"
#include "constantes.h"

// #include <iostream>
// #include <sstream>
#include <stdio.h>
#include <stdlib.h>

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

using namespace std;
using namespace sf;

int main()
{

    sf::RenderWindow window(sf::VideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE), "Jeu");
    window.setKeyRepeatEnabled(false);
    window.setMouseCursorVisible (true);
    window.setFramerateLimit(60);


 sf::IntRect subRect(0,0,30,40);
 sf::Vector2f position(0,0);

   Personnage perso ("Eau/sprite.png", subRect, position);


   // spritePerso2.setTextureRect(IntRect(30, 0, 30, 40));



    sf::Event event;
    while (window.isOpen())
    {

        while (window.waitEvent(event))
        {
/*
            window.clear(sf::Color::White);
*/

            window.draw(perso.getSprite());

/*
        sf::Texture mySprite1;
        mySprite1.loadFromImage(perso.getImage());
        sf::Sprite sp;
        sp.setTexture(mySprite1);

            window.draw(sp);
*/


            if (event.type == sf::Event::Closed)
                window.close();


            window.display();
        }
    }

    return 0;
}
 

Personnage.h
#ifndef PERSONNAGE_H
#define PERSONNAGE_H

#include <iostream>
#include <string>

#include <SFML/Graphics.hpp>

class Personnage
{
    public:
        Personnage(const std::string & filePath, sf::IntRect subRect, sf::Vector2f position);
        virtual ~Personnage();

        sf::Sprite getSprite();
        sf::Image getImage();
/*
        void recevoirDegats(int nbDegats);
        void attaquer(Personnage &cible);
*/

    protected:
    private:

        sf::Image myImage;
        sf::Sprite mySprite[4]; //a changer
        sf::Sprite spriteActuel;


};

#endif // PERSONNAGE_H
 

Personnage.cpp
#include "Personnage.h"

#include <string>

using namespace std;

Personnage::Personnage(const string &filePath, sf::IntRect subRect, sf::Vector2f position)
{
    if(!myImage.loadFromFile(filePath))
    {
        cout << "erreur" << endl;
    }
    else
    {
        myImage.createMaskFromColor(sf::Color(255,0,255));
        sf::Texture mySprite1;
        mySprite1.loadFromImage(myImage);

        for(int i=0 ; i<4 ; i++)
        {
            mySprite[i].setTexture(mySprite1);
            mySprite[i].setTextureRect(sf::IntRect(30*i, 0, 30, 40));
        }

        spriteActuel = mySprite[0];

    }
}

sf::Sprite Personnage::getSprite()
{
    return spriteActuel;
}
sf::Image Personnage::getImage()
{
    return myImage;
}

Personnage::~Personnage()
{

}


Voici le code que j'ai, en version light pour cibler le pb
« Modifié: Octobre 14, 2012, 04:57:25 pm par Ultima »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.0] Image/Texture/Sprite
« Réponse #5 le: Octobre 14, 2012, 06:45:50 pm »
C'est la texture qu'il faut stocker, l'image ne sert à rien.
Laurent Gomila - SFML developer