Amis programmeurs,
Je sollicite votre aide pour le point suivant:
Comment gérer efficacement les textures d'une entité dont la taille n'est pas connue à l'avance?
Je m'explique: je souhaite créer une barre de défilement (i.e. Scrollbar) similaire à toutes celles que nous rencontrons habituellement. La taille de cette Scrollbar dépend de la longueur du contenu à afficher. Dès lors, comment puis-je efficacement gérer son apparence à l'écran?
Imaginons qu'au niveau de la texture, j'ai 3 tuiles:
|->
Si je dois créer une barre de dimension égale à 5, je vais avoir ceci:
|--->
On constate donc que j'ai tjs la tuile de "début" (i.e. | ) et la tuile de "fin" (i.e. > ). En fonction de la longueur, je rajoute le nombre de tuiles intermédiaires requis (i.e. - ).
Actuellement, dans mon code, ça fonctionne comme suit:
Je charge la tilesheet qui contient les 3 tuiles.
Je crée 3 sf::RectangleShape (i.e. un pour le début, un pour la fin, et un pour la partie intermédiaire variable). J'applique une tuile par RectangleShape, en m'assurant que ma texture peut se répéter pour la tuile du milieu. Ainsi, la tuile intermédiaire qui mesure 1 se répètera 3 fois dans un RectangleShape de taille 3.
Cela fonctionne, mais ça me semble affreusement lourd, voire tirer par les cheveux. Je voudrais donc savoir si l'un de vous à un meilleur moyen de gérer cela?
PS: Je ne souhaite pas utiliser la méthode "setScale" car si je ne dis pas de bêtise, cela va "étirer" ma texture de base et je risque donc de perdre en qualité de rendu (i.e. les pixels seront plus grossiers).
PS 2: Voici le code, au cas ce serait utile (ne prêtez pas attention aux constantes de taille et de positionnement, elles sont juste là temporairement)
/* Texture */
sf::IntRect topText(0, 0, 17, 4);
sf::IntRect midText(0, 4, 17, 4);
sf::IntRect lowText(0, 8, 17, 6);
sf::Texture texture;
if(!texture.loadFromFile("ScrollbarTexture.png"))
{
std::cout << "Erreur de chargement de l'image" << std::endl;
}
sf::FloatRect barSize(0.f, 0.f, 17.f, 100.f);
sf::IntRect textureRect(barSize);
texture.setRepeated(true);
/* Sprite de Scrollbar */
sf::Sprite barSprite;
barSprite.setPosition(30.f, 30.f);
/* RenderTexture */
sf::RenderTexture renderTexture;
renderTexture.create(barSize.width, barSize.height);
renderTexture.clear(sf::Color(0, 0, 0, 0));
sf::RectangleShape topRect;
topRect.setSize(sf::Vector2f(barSize.width, 4.f));
topRect.setTexture(&texture);
topRect.setTextureRect(topText);
sf::RectangleShape lowRect;
lowRect.setSize(sf::Vector2f(barSize.width, 6.f));
lowRect.setTexture(&texture);
lowRect.setTextureRect(lowText);
lowRect.setPosition(topRect.getPosition().x, topRect.getPosition().y + 91.f);
sf::RectangleShape midRect;
midRect.setSize(sf::Vector2f(barSize.width, barSize.height - topRect.getGlobalBounds().height - lowRect.getGlobalBounds().height));
midRect.setTexture(&texture);
midRect.setTextureRect(midText);
midRect.setPosition(topRect.getPosition().x, topRect.getPosition().y + topRect.getGlobalBounds().height);
renderTexture.draw(topRect);
renderTexture.draw(midRect);
renderTexture.draw(lowRect);
renderTexture.display();
/* Application de la RenderTexture au Sprite de Scrollbar */
barSprite.setTexture(renderTexture.getTexture());
barSprite.setTextureRect(textureRect);