-
Bonjour, voilà pour ma gui j'ai un soucis
Voilà, maintenant j'ai un TextArea (un edit text en multi ligne)
Mais voilà, quand on fait défiler les scrollbar, sa fait bouger le texte... (sa doit servir à la faire défiler)
Mais le soucis, c'est que je ne sais pas comment faire en sorte de n'affiche que le texte dans la zone du TextArea
Avec Sprite, on a un fonction pour n'afficher qu'une partie du Drawable :
Sprite.SetTextureRect(sf::IntRect(200,200,300,150));
Mais, comment faire avec sf::Text ?
ps: N'existe t'il pas une technique d'afficher une sorte de camera 2D, dans un endroit ?
sf::Camera Camera;
Camera.SetSize(200,200);
Camera.SetPosition(50,50);
// Boucle d'affichage
Camera.Draw(Sprite);
Window.Draw(Camera);
-
Il n'y a pas encore de fonction/classe dédiée pour ça, mais c'est prévu.
En attendant tu peux t'en sortir avec, au choix :
- une vue et son viewport intelligemment défini
- un rendu intermédiaire sur un sf::RenderTexture
-
Ah oui tien, les viewport, je l'avais zapper ::)
Sinon j'ai un soucis avec RenderTexture
sf::RenderTexture rw;
rw.Create(230,230,false);
rw.Clear(sf::Color::Red);
sf::Texture at;
at.LoadFromFile("nature.png");
sf::Sprite as;
as.SetTexture(at);
as.SetTextureRect(sf::IntRect(0,0,200,200));
rw.Draw(as);
sf::Sprite TS(rw.GetTexture());
window.Draw(TS);
Et je me retrouve avec le Haut en Bas, et le Bas en Haut
Et ce, même si je fais rw.Create(230,230,true); (au lieu de false)
Si la gauche et la droite étais inversé aussi, j'aurais pu faire une rotation, mais là, sa va être un peu dur ;D
Edit: J'ai trouver, la solution (un peu simple, mais fallait y pensé ^^)
rw.Display();
Sinon, merci Laurent !
-
la solution (un peu simple, mais fallait y pensé ^^)
... ou bien regarder dans la doc.
-
Je up se sujet pour savoir si il existe à ce jour un moyen de n'afficher qu'une partie d'un Drawable, et non l'afficher en entière, sans passer par un sf.RenderTexture (qui bouffe pas mal de ressource) ? Merci d'avance :D .
-
Rien de nouveau non.
Tout ce qu'il y a à savoir se trouve là :
https://github.com/SFML/SFML/issues/1
-
Tu parles d'une classe sf::ClippingMask mais je ne trouve pas sa documentation.... Il n'y a pas un moyen avec openGL de forcer l'affichage d'une unique partie d'un seul drawable ? Merci d'avance :)
-
Tu parles d'une classe sf::ClippingMask mais je ne trouve pas sa documentation....
C'est une tâche à faire. Si elle était déjà implémentée elle serait fermée ;)
Il n'y a pas un moyen avec openGL de forcer l'affichage d'une unique partie d'un seul drawable ? Merci d'avance
Si, mais pas de mélanger ça avec SFML.
-
Désoler, pas l'habitude avec les issues x) (je croyais que c'était déjà fait x) ). BOn ben soit j'attends, soit je code un trucs assez sale avec les sf.RenderTexture, merci encore :D
-
Le truc intéressant qui est dit dans cette tâche c'est qu'on peut très facilement émuler ça avec une vue ayant le viewport qui va bien.
-
Je n'ai pas compris comment ta vue peut faire ceci puisque je veux uniquement une partie d'un ensemble de drawable. Je pensais plus faire un sf.RenderTexture, dessiner dedans, récupéré la texture, la mettre dans un Sprite avec un subRectTexture, non ?
-
Ca marche, mais c'est mieux avec la vue.
Tu crée une nouvelle vue, tu lui mets son rectangle et son viewport à la zone de clipping souhaitée, et tu dessines dedans tout ce que tu veux clipper. C'est tout, et ça produit l'effet voulu (puisque tout ce qui sort du viewport est clippé par la carte graphique).
-
Tu aurais un exemple de code s'il te plait ? J'ai du mal à voir avec la vue comment faire (à moins que je créé une seconde vue que j'applique à une sf.RenderTexture, mais même comme ça j'ai du mal à voir (les bandes noires à côter seront visibles lors du draw finale, non ?)
-
// je dessine des trucs non clippés...
window.draw(truc_pas_clippe);
// je clip avec le rectangle [100, 100, 50, 200]
sf::View clipView(sf::FloatRect(100.f, 100.f, 50.f, 200.f));
clipView.setViewport(sf::FloatRect(100.f / window.getSize().x,
100.f / window.getSize().y,
50.f / window.getSize().x,
200.f / window.getSize().y))
window.setView(clipView);
// je dessine des trucs clippés...
window.draw(truc_clippe);
// je restaure la vue par défaut
window.setView(window.getDefaultView());
// je dessine des trucs non clippés...
window.draw(autre_truc_pas_clippe);
-
Ah d'accord, je peux carrément appliquer deux vues différentes dans un même display ! Je ne le savais pas, merci beaucoup, ça fait exactement ce que je voulais :D
ps : il manque un setView() avant ton second draw :) .
-
il manque un setView() avant ton second draw
Ah oui bien vu, j'avais oublié l'essentiel ;D
-
une solution aussi consiste à coupé le std::string en fonction de la taille voulu.
std::string cpy = std::string(string); // string de ton texte
sf::Vector2f targetSize = ... // la taille que tu veut
sf::FloatRect textSize = text->getLocalBounds();
while( textSize.width > targetSize.x )
{
textSize = text->getLocalBounds();
cpy = cpy.substr(0, cpy.size()-1);
text->setString(cpy);
}
-
Ceci fonctionnerai uniquement pour les sf::Text, et on ne pourrait pas découper les caractères. Ensuite,le clip me servira surtout pour les layouts que je veux "découper" (pour faire un style défillement).
Édit : merci Laurent, le clipping est entièrement ajouter à ma GUI :D . Vais pouvoir faire les WIdgets restants assez simplement ;) .