ATTENTION : ceci est la documentation d'une version antérieure de SFML ; la documentation de la dernière version officielle est accessible via le menu principal
Tutoriel - Module graphique - Afficher du texte
Introduction
Dans ce tutoriel, nous allons couvrir le rendu de texte à l'aide de la classe sf::String.
Charger une police
Avant d'afficher du texte, il faut tout d'abord une police de caractères pour écrire celui-ci.
Une police, dans SFML, est définie par la classe
sf::Font.
Etant donné qu'il n'y a habituellement rien d'autre à faire avec une police que la charger et l'utiliser,
cette classe ne définit en fait que deux fonctions, LoadFromFile et LoadFromMemory.
sf::Font MyFont; // Chargement à partir d'un fichier sur le disque if (!MyFont.LoadFromFile("arial.ttf")) { // Erreur... } // Chargement à partir d'un fichier en mémoire if (!MyFont.LoadFromMemory(PointerToFileData, SizeOfFileData)) { // Erreur... }
Comme vous pouvez le voir, toutes deux renvoient true après un chargement réussi, et false
si au contraire une erreur est survenue.
Vous pouvez également passer deux paramètres additionnels à ces fonctions : la taille des caractères, ainsi que
le jeu de caractères à générer. Une taille de caractères plus élevée signifiera une qualité meilleure, mais soyez
prudent car cela augmentera également la mémoire vidéo utilisée. La taille par défaut est 30.
Passer votre propre jeu de caractères peut être nécessaire si vous avez l'intention d'utiliser des caractères
non-ASCII ; dans ce cas, passez simplement la liste des caractères que vous comptez utiliser en tant que chaîne large.
L'unicode est bien entendu supporté, vous pouvez donc tout aussi bien passer des caractères chinois ou arabes par
exemples. Par défaut, le jeu de caractères est composé des caractères ASCII étendus dont les codes sont entre 31 et 255
(les caractères de 0 à 30 ne sont pas imprimables), ce qui sera suffisant pour une utilisation courante. Quelque
soit le jeu de caractères que vous spécifiez, les caractères spéciaux ' ', '\n', '\v' et '\t' seront toujours
ajoutés à celui-ci.
Voici un exemple d'utilisation avec la taille et le jeu de caractères explicitement donnés :
sf::Font MyFont; if (!MyFont.LoadFromFile("arial.ttf", 50, L"abcdefghij")) { // Erreur... }
sf::Font peut charger de nombreux types de fichiers de polices, des TTF standards aux PCF de X11. Vous pouvez vous référer
à la
sf::String. Une telle instance
possède trois paramètres : le texte à afficher, la police de caractères utilisée, et la taille des caractères. Notez bien
que sf::String n'est pas une classe de chaînes de caractères dans le sens de std::string,
c'est-à-dire qu'elle ne fournit aucune fonction ayant un rapport avec la manipulation de la chaîne en elle-même
comme par exemple find, append, substring, etc. Elle focalise uniquement sur
la partie graphique, et laisse la manipulation de la chaîne à std::string (ou n'importe quelle
autre classe que vous préférez utiliser).
Donc, voici comme nous définirions une chaîne contenant le texte "Hello", utilisant la police "arial.ttf", et avec une taille de caractères de 50 :
// Chargement de la police à partir d'un fichier sf::Font MyFont; if (!MyFont.LoadFromFile("arial.ttf", 50)) { // Erreurr... } sf::String Text("Hello", MyFont, 50); // Ou, si vous souhaitez le faire après la construction : sf::String Text; Text.SetText("Hello"); Text.SetFont(MyFont); Text.SetSize(50);
Vous pouvez également utiliser des chaînes de caractères larges, si vous comptez utiliser du texte unicode :
Text.SetText(L"Hello");
Notez que sf::String utilise en interne des chaînes larges (types std::wstring et wchar_t), et qu'utiliser
des chaînes multi-octets (std::string et char) nécessitera des conversions qui peuvent
être chères. Ainsi, dans la mesure du possible, préférez toujours utiliser des chaînes larges pour obtenir un
maximum de performances.
Une petite astuce : si vous voulez obtenir la meilleure qualité visuelle possible, essayer de charger vos polices avec une taille au moins aussi élevée que celle qu'utiliseront vos chaînes. Sinon, les caractères seront redimensionnés et pourront apparaître légèrement flous sur les contours. De la même manière, essayez d'utiliser des tailles faibles lorsque vous comptez afficher des textes très petits, sinon les caractères pourront une fois de plus être trop redimensionnés et dégrader la qualité visuelle globale.
Notez que vous pouvez en fait utiliser une chaîne sans avoir chargé une seule police : SFML fournit une police par défaut, qui est la police Arial avec une taille de caractères de 30.
Text.SetFont(sf::Font::GetDefaultFont());
Les chaînes peuvent également utiliser différents styles : normal (par défaut), ou n'importe quelle combinaison de gras (bold), italique (italic) et souligné (underlined).
sf::String Text = "I like donuts";
Text.SetStyle(sf::String::Bold | sf::String::Italic | sf::String::Underlined);
Text.SetStyle(sf::String::Regular);
Afficher une chaîne
sf::String est une classe affichable standard, ce qui signifie qu'elle hérite de sf::Drawable et reçoit tous des attributs et fonctions, tout comme sf::Sprite.
Ainsi vous pouvez modifier sa position, sa taille, son orientation, sa couleur, etc. :
Text.SetColor(sf::Color(128, 128, 0)); Text.SetRotation(90.f); Text.SetScale(2.f, 2.f); Text.Move(100.f, 200.f);
Puis, pour afficher la chaîne dans une fenêtre donnée, vous n'avez qu'à utiliser la fonction Draw :
sf::RenderWindow Window; ... Window.Draw(Text);
Gestion des polices et des chaînes
Vous devez être particulièrement prudent lorsque vous manipulez des polices de caractères. Une instance de
sf::Font est une ressource qui est lente à charger, lourde à copier et qui utilise beaucoup de mémoire.
Pour une bonne discussion à propos de la gestion des ressources, je vous renvoie au paragraphe "Gestion des images et des sprites" du tutoriel sur les sprites, en remplaçant simplement le mot "Image" par "Police" et "Sprite" par "Chaîne".
Conclusion
C'est tout ce qu'il y a à dire à propos des chaînes SFML. Vous pouvez maintenant afficher du texte avec différentes
polices, tailles et styles, plus toutes les fonctionnalités graphiques des objets affichables de la SFML.
Vous pouvez maintenant vous rendre au tutoriel suivant, qui vous montrera comment ajouter des
post-effects
temps réel à vos graphiques.
- graphics-fonts.cpp (1.67 Ko)
