Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Assouan le Avril 12, 2012, 11:01:38 pm

Titre: [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Assouan le Avril 12, 2012, 11:01:38 pm
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);
Titre: Re : Zone d'affichage (pour sf::Text)
Posté par: Laurent le Avril 12, 2012, 11:06:38 pm
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
Titre: Re : Zone d'affichage (pour sf::Text)
Posté par: Assouan le Avril 12, 2012, 11:59:19 pm
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 !
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Avril 13, 2012, 07:56:41 am
Citer
la solution (un peu simple, mais fallait y pensé ^^)
... ou bien regarder dans la doc.
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 12:30:34 pm
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 .
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 01:18:57 pm
Rien de nouveau non.

Tout ce qu'il y a à savoir se trouve là :
https://github.com/SFML/SFML/issues/1
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 02:53:56 pm
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 :)
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 03:04:45 pm
Citer
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 ;)

Citer
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.
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 03:23:34 pm
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
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 03:26:58 pm
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.
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 03:43:50 pm
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 ?
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 04:09:13 pm
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).
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 04:49:36 pm
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 ?)
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 04:55:55 pm
// 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);
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 05:02:28 pm
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 :) .
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Laurent le Juillet 15, 2013, 05:49:28 pm
Citer
il manque un setView() avant ton second draw
Ah oui bien vu, j'avais oublié l'essentiel ;D
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: Cpl.Bator le Juillet 15, 2013, 06:57:21 pm
une solution aussi consiste à coupé le std::string en fonction de la taille voulu.

Citer
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);
}
Titre: Re : [Résolu] Zone d'affichage (pour sf::Text)
Posté par: gaulois94 le Juillet 15, 2013, 07:19:14 pm
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 ;) .