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

Auteur Sujet: [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions  (Lu 3834 fois)

0 Membres et 1 Invité sur ce sujet

Flaco

  • Newbie
  • *
  • Messages: 36
  • Glory to Arztotzka!
    • Voir le profil
    • Core Unit
    • E-mail
Bonjour/Bonsoir,

Je m'attaque aux images (et sprites) avec la 2.0 et je me retrouve perdu.

J'aimerais tout d'abord savoir si la fonction membre loadFromMemory() (à l'instar de loadFromFile() ) me permettrais de charger une image sans pour autant avoir le .png à "découvert" (c'est à dire, le charger dans un fichier crypté ou quoi que ce soit d'autre, tant que le joueur n'a pas accès à cette image).

Si oui, comment utilise-t-on loadFromMemory() dans ce cas précis?
Si non, à quoi sert loadFromMemory()?

Ensuite j'avais une deuxième question:

Si je charge une image (sf::Texture) entièrement blanche, et que je veux colorer certaines parties (en envoyant des sf::Color j'imagine) comment dois-je m'y prendre, sachant que cette image sera passée en sprite et deviendra le personnage (l'idée étant de laisser le joueur colorer son personnage et ses vêtements).

Je dois bien utiliser une sf::Texture pour passer mon image à un sprite n'est-ce pas? Ou dois-je utiliser une sf::Image (comme en SFML 1.6, si c'est le cas je n'aurai qu'à utiliser setPixel() et modifier "à la main" chaque pixel)?

Voila je pense que l'essentiel y est, désolé pour ce post un peu sans dessus-dessous et merci d'avance :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #1 le: Août 14, 2012, 08:24:17 am »
Citer
J'aimerais tout d'abord savoir si la fonction membre loadFromMemory() (à l'instar de loadFromFile() ) me permettrais de charger une image sans pour autant avoir le .png à "découvert" (c'est à dire, le charger dans un fichier crypté ou quoi que ce soit d'autre, tant que le joueur n'a pas accès à cette image).
C'est à ça qu'elle sert, charger un fichier qui se trouve en mémoire plutôt que sur le disque dur.

Citer
Si oui, comment utilise-t-on loadFromMemory() dans ce cas précis?
C'est quoi "ce cas précis" ? Tout ce qui est extraction, décompression, décryptage, etc. est de ton ressort, il faut que tu aies le fichier en clair en mémoire au moment où tu appelles loadFromMemory. Le reste est assez basique : tu passes à la fonction un pointeur vers le fichier, ainsi que sa taille.

Citer
Je dois bien utiliser une sf::Texture pour passer mon image à un sprite n'est-ce pas? Ou dois-je utiliser une sf::Image (comme en SFML 1.6, si c'est le cas je n'aurai qu'à utiliser setPixel() et modifier "à la main" chaque pixel)?
Il faut que tu bidouilles ton image avant de la passer à un sf::Texture. Que tu utilises sf::Image ou un buffer perso, ça c'est à toi de voir selon ce que tu veux en facilité d'utilisation et performances.
Laurent Gomila - SFML developer

Flaco

  • Newbie
  • *
  • Messages: 36
  • Glory to Arztotzka!
    • Voir le profil
    • Core Unit
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #2 le: Août 14, 2012, 03:03:42 pm »
Okay, je vois! Merci à toi Laurent. :)

"dans ce cas précis" c'était au cas où y'aurait plusieurs type d'utilisations en fonction de ce qu'on veut faire.
Donc il faut que je passe le fichier en mémoire, j'ai approfondis mes recherches et ai lu qu'il fallait le passer dans un tableau de char? 

J'ai l'impression que l'utilisation de loafFromMemory() est claire pour tout le monde mais j'ai jamais rien vu de tel (bon, je programme pas depuis longtemps non plus).
Je vais chercher les sources d'un programme qui utilise cette fonction membre alors. :)

Merci à toi!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #3 le: Août 14, 2012, 03:11:02 pm »
Mais qu'est-ce que tu ne comprends pas ? Si les octets de ton fichier sont en mémoire plutôt que sur le disque, alors tu peux y accéder avec un pointeur (on utilise char* car c'est ce qui représente le mieux un "tableau d'octets", mais peu importe le type en réalité), et c'est ce pointeur que tu files à loadFromMemory. Il n'y a vraiment rien de plus compliqué que ça. C'est la même différence entre avoir du texte dans un fichier, et du texte dans une chaîne de caractères en mémoire.

Si tu veux un exemple c'est très facile :
std::vector<char> charger_fichier_en_memoire(std::string filename)
{
    std::ifstream fichier(filename.c_str());
    fichier.seekg(0, ios::end);
    int taille = is.tellg();
    fichier.seekg(0, ios::beg);
    std::vector<char> contenu_du_fichier(taille);
    fichier.read(&contenu_du_fichier[0], taille);
    return contenu_du_fichier;
}

std::vector<char> fichier = charger_fichier_en_memoire("plop.png");
sf::Texture texture;
texture.loadFromMemory(&fichier [0], fichier .size());
« Modifié: Août 14, 2012, 03:13:32 pm par Laurent »
Laurent Gomila - SFML developer

Flaco

  • Newbie
  • *
  • Messages: 36
  • Glory to Arztotzka!
    • Voir le profil
    • Core Unit
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #4 le: Août 14, 2012, 03:14:16 pm »
Aaah je vois maintenant, non c'est parce que j'avais une vision faussée de son utilisation.
Okay, c'est beaucoup plus clair maintenant en tout cas! Merci beaucoup! :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #5 le: Août 14, 2012, 03:15:44 pm »
Citer
c'est parce que j'avais une vision faussée de son utilisation
Laquelle ? Si ça peut m'aider à éviter certaines confusion dans le tutoriel ou la doc, je prends :)
Laurent Gomila - SFML developer

Flaco

  • Newbie
  • *
  • Messages: 36
  • Glory to Arztotzka!
    • Voir le profil
    • Core Unit
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #6 le: Août 14, 2012, 03:24:03 pm »
Bien sûr, en fait je pensais plutôt que je devrais créer un fichier .txt (par exemple) dans lequel serait écrites chaque image (et là je bloquais sur la manière de l'écrire). Texte/Nombres que j'irais piocher dans un tableau de char que ensuite je passerais à loadFromMemory. En gros c'était ça.
Je ne pensais pas que par "mémoire" on entendais "à même titre qu'un tableau quelconque" (ce qui parait logique pourtant).

Ca doit être surtout parce que je n'ai aucune connaissances sur les images, octets, etc. Et donc, par exemple, pour crypter une image je ne sais pas m'y prendre, donc j'imaginais que pour la crypter et puis la charger en mémoire je devrais m'y prendre comme plus haut. ^^ Enfin, c'est déjà une bonne partie de résolu je pense là!

Une image cryptée se charge obligatoirement avec loadFromMemory donc? Histoire de pouvoir décrypter le contenu du tableau qui contient les octets, c'est ça?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #7 le: Août 14, 2012, 03:48:33 pm »
Ok je vois.

Citer
Une image cryptée se charge obligatoirement avec loadFromMemory donc?
Ce n'est pas directement lié, l'utilisation ou non de loadFromMemory dépend de se trouve l'image. Mais puisque dans 99.99% des cas tu vas déchiffrer ton image en mémoire (aucun intérêt de la réécrire dans un fichier intermédiaire), alors oui loadFromMemory s'impose comme une évidence dans ce cas.
Laurent Gomila - SFML developer

Flaco

  • Newbie
  • *
  • Messages: 36
  • Glory to Arztotzka!
    • Voir le profil
    • Core Unit
    • E-mail
Re : [sf::Texture/Image/Sprite 2.0] loadFromMemory() & autres questions
« Réponse #8 le: Août 14, 2012, 03:55:40 pm »
D'accord, merci pour ton temps et tes explications!

Bonne journée :)