Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Skima

Pages: [1]
1
C'est bon ça marche !!
Merci beaucoup, j'avais en effet confondu global et local ... du coup j'avais la logique du local mais en utilisant l'autre --'

Bref, c'est nickel !
Merci !

2
Justement, je l'ai fait ce dessin ... je ne dois pas bien comprendre comment marche le GlobalBounds alors ...

Voilà une reproduction de mon dessin :P

Admirez le côté artistique !

Je suis à côté de la plaque ? (surement, sinon ma solution devrait marcher ...)

3
Je dois rater un truc, mais je ne comprends pas :/
J'ai essayé

text->setPosition(x+xBounds,y+yBounds-bounds.top);
Puis j'ai regardé les valeurs de bounds.top qui sont en fait les x/y du text en fonction du 0;0 de la fenêtre (c'est bien ça ?)

Donc j'ai essayé ça :

text->setPosition(x+xBounds,y+yBounds-(bounds.top-x));

Mais ça ne change pas mon problème (et ça en crée même un nouveau : les lettres "bougent" une fois collées en haut à gauche du rectangle, une fois centrées toujours avec le décalage)

Je comprends le principe des left/top, mais je n'arrive pas à l'appliquer :/

4
Les x et y des localBounds d'un texte ne sont pas 0

Du coup ça veut dire quoi ? Il faut que j'utilise une autre méthode ? Que je calcule le "décalage" ? Si oui, comment ? :/

5
Bonjour,

J'essaye d'afficher des "touches" de clavier comportant un rectangle (dessin de la touche) et un sf::Text (valeur de la touche).
Je voulais donc positionner le contenu en fonction de la taille de la lettre.
J'ai donc écrit :

Dessin du rectangle :
    sf::VertexArray rectangle(sf::Quads, 4);
    rectangle[0].position = sf::Vector2f(x, y);
    rectangle[1].position = sf::Vector2f(x+width, y);
    rectangle[2].position = sf::Vector2f(x+width, y+height);
    rectangle[3].position = sf::Vector2f(x, y+height);
    sf::Color sfBackgroundColor(backgroundColor['r'], backgroundColor['g'], backgroundColor['b']);
    rectangle[0].color = sfBackgroundColor;
    rectangle[1].color = sfBackgroundColor;
    rectangle[2].color = sfBackgroundColor;
    rectangle[3].color = sfBackgroundColor;

    keyboard->getWindow()->draw(rectangle);
 

Ecriture de la lettre :
    sf::Color sfFontColor(fontColor['r'], fontColor['g'], fontColor['b']);
    text->setString(value);
    text->setColor(sfFontColor);

    sf::FloatRect bounds = text->getGlobalBounds();
    int xBounds = (width - bounds.width) /2;
    int yBounds = (height - bounds.height) /2;
    text->setPosition(x+xBounds ,y+yBounds);
   
    keyboard->getWindow()->draw(*text);
 

Le sf::Text est initialisé dans le constructeur de ma classe :
    this->text = new sf::Text();

    this->font = new sf::Font();
    font->loadFromFile("font/arial.TTF");

    text->setFont(*font);

    text->setCharacterSize(fontSize);
    text->setPosition(x, y);
    text->move(15, 5);
 

Quand je lance ça, j'ai un décalage en y entre la position prévue de la lettre (x+xBounds, y+yBounds) et l'affichage effectif :


(J'ai dessiné en rouge le rectangle représentant la position attendue de la lettre :
        sf::VertexArray rectText(sf::Quads, 4);
        rectText[0].position = sf::Vector2f(x+xBounds, y+yBounds);
        rectText[1].position = sf::Vector2f(x+xBounds+bounds.width, y+yBounds);
        rectText[2].position = sf::Vector2f(x+xBounds+bounds.width, y+yBounds+bounds.height);
        rectText[3].position = sf::Vector2f(x+xBounds, y+yBounds+bounds.height);
        rectText[0].color = sf::Color::Red;
        rectText[1].color = sf::Color::Red;
        rectText[2].color = sf::Color::Red;
        rectText[3].color = sf::Color::Red;

        keyboard->getWindow()->draw(rectText);
 
)

D'où peut venir se décalage ? Comment puis-je régler ça ?

Merci d'avance :)

6
Bon, j'ai finalement trouvé la solution à mon problème. Je la met ici, au cas où ça intéresserai quelqu'un :

Le problème d'affichage du texte vient du fait qu'on recrée l'objet sf::Text à chaque appel de la méthode "print()" (qui affiche les lettres).
La création de l'objet ralentit alors énormément l’exécution du script.

J'ai donc stocké l'objet sf::Text dans un attribut de ma classe pour uniquement ré indiquer sa couleur, sa taille et sa valeur.
L'affichage marche maintenant nickel ;)

Voilà, j'espère que ça pourra éviter à quelqu'un de chercher comme moi pendant plus d'une semaine ... :)

7
Du coup, quelqu'un aurait-il une solution à mon problème ?
Comment puis-je afficher du texte, sans dépasser les capacité de la carte graphique et donc ralentir l’exécution ?

8
Le problème est justement que je ne sais pas quoi utiliser comme objet, c'est pour cela que je n'avais pas mit de code.

Si besoin, voilà ma boucle d'affichage de la fenêtre :
while(window.isOpen())
        {
            //cout << "clock : " << clock.getElapsedTime().asMilliseconds() <<endl;
        window.clear(windowColor);

        // on inspecte tous les évènements de la fenêtre qui ont été émis depuis la précédente itération
        sf::Event event;
        while (window.pollEvent(event))
        {
            // évènement "fermeture demandée" : on ferme la fenêtre
            if (event.type == sf::Event::Closed)
                window.close();
        }
               
                // [...] D'autres traitement qui n'utilisent pas SFML
               
                //on verifie a chaque fois qu'il existe un prochain groupe a flasher
                if(numGroupEnCour < nbGroupSequence)
                {
            if(flagSequence == 0)//premier passage
                        {
                            //cout << "init premier passage" << endl;
                                flagSequence = 1;//On assure qu'on ne repasse pas a l'initialisation

                                //on initialise les variables de temps (allumer et eteind) pour la période du groupe, en cour de flash
                                time_on = lapsTime_on;
                                time_off = lapsTime_on + lapsTime_off;

                                //on récupère le premier groupe de lettre et on le met a l'état on
                                g = groupList[numGroupEnCour];

                                //Activation du flashage juste après
                                g->onGroup();

                                lastFlash = 1;
                        }
                        else if(clock.getElapsedTime().asMilliseconds() > time_on && lastFlash == 1)//si le chrono a dépassé le temps a "on" des lettres on les passes a off
                        {
                //cout << "passage Groupe a off" <<endl;
                                g->offGroup();

                                lastFlash = 0;
                        }
                        else if(clock.getElapsedTime().asMilliseconds() > time_off && lastFlash == 0)// si le chrono a dépassé le temps des lettres a off
                        {
                                //on initialise les prochains time a dépassé
                                time_on += lapsTime_off + lapsTime_on;
                                time_off += lapsTime_on + lapsTime_off;
                                g = groupList[numGroupEnCour];//On recupère le prochain group
                                numGroupEnCour++;//IMPORTANT : On incrémente en premier !

                                //Activation du flashage juste après
                                g->onGroup();

                                lastFlash = 1;
                        }
                        else if (lastFlash==1) {
                g->onGroup();
                        }
                        else if (lastFlash==0) {
                g->offGroup();
                        }

                }
                else// Si plus de group a flasher on réouvre la condition d'initialisation d'une nouvelle sequence et on restart le chrono qui défilera jusqu'a ce que le délai entre 2 flash sequence soit écoulé pour réouvrir la condition d'initialisation
                {
                    //cout << "reinit nouvelle sequence" <<endl;
            flagSequence = 0;
            delay = 1;
                        clock.restart();
                }

        // fin de la frame courante, affichage de tout ce qu'on a dessiné
        window.display();
        }

Les méthodes onGroup() et offGroup() appellent plusieurs fois (pour chaque lettre du groupe) la méthode print() décrite au post précédent.

9
Mmh, je ne vois pas ce que je peux ajouter, à part que j'utilise la version 2.1 de SFML sous windows.

Sinon, je n'ai pas de message d'erreur et si vous tenez à avoir un bout de code, voilà comment j'utilise les vertexarray :

void Key::print()
{

    sf::Color darkGrey(60, 60, 60);
    sf::Color grey(120, 120, 120);
    sf::Color silver(200, 200, 200);

    int shadowMove = 3;
    sf::VertexArray shadow(sf::Quads, 4);
    shadow[0].position = sf::Vector2f(x+shadowMove, y+shadowMove);
    shadow[1].position = sf::Vector2f(x+width+shadowMove, y+shadowMove);
    shadow[2].position = sf::Vector2f(x+width+shadowMove, y+height+shadowMove);
    shadow[3].position = sf::Vector2f(x+shadowMove, y+height+shadowMove);
    shadow[0].color = sf::Color::Black;
    shadow[1].color = darkGrey;
    shadow[2].color = darkGrey;
    shadow[3].color = darkGrey;

    keyboard->getWindow()->draw(shadow);

    sf::VertexArray border(sf::Quads, 4);
    border[0].position = sf::Vector2f(x, y);
    border[1].position = sf::Vector2f(x+width, y);
    border[2].position = sf::Vector2f(x+width, y+height);
    border[3].position = sf::Vector2f(x, y+height);
    border[0].color = grey;
    border[1].color = grey;
    border[2].color = grey;
    border[3].color = grey;

    keyboard->getWindow()->draw(border);

    sf::VertexArray rectangle(sf::Quads, 4);
    rectangle[0].position = sf::Vector2f(x+borderSize, y+borderSize);
    rectangle[1].position = sf::Vector2f(x+width-borderSize, y+borderSize);
    rectangle[2].position = sf::Vector2f(x+width-borderSize, y+height-borderSize);
    rectangle[3].position = sf::Vector2f(x+borderSize, y+height-borderSize);
    rectangle[0].color = silver;
    rectangle[1].color = silver;
    rectangle[2].color = silver;
    rectangle[3].color = silver;

    keyboard->getWindow()->draw(rectangle);
}
 

Et comment je faisais avant (avec le Text en plus) :
sf::RectangleShape rectangle;

    rectangle.setSize(sf::Vector2f(width-borderSize, height-borderSize));
    rectangle.setOutlineColor(grey);
    rectangle.setFillColor(silver);
    rectangle.setOutlineThickness(borderSize);
    rectangle.setPosition(x, y);

    keyboard->getWindow()->draw(rectangle);

    sf::Text text;

    sf::Font font;
    font.loadFromFile("arial.TTF");

    text.setFont(font);
    text.setString(value);
    text.setCharacterSize(fontSize);
    //text.setStyle(sf::Text::Bold);
    text.setColor(sf::Color::White);
    text.setPosition(x, y);
    text.move(15, 5);

    keyboard->getWindow()->draw(text);
 

Je ne vois pas ce que je peux ajouter de plus :/
Je suis désolée si mon poste ne convient pas, mais dans ce cas, dites-moi précisément ce que vous attendez ;)

10
Bonjour à tous,

Je suis entrain de créer une interface qui consiste à afficher des lettres et à changer leur couleur régulièrement (disons toutes les 120ms en moyenne).

J'avais tout d'abord réalisé mon interface en affichant un sf::RectangleShape et en ajoutant par dessus un sf::Text.

J'ai vite été limitée par ma carte graphique et mes changements de couleurs, qui étaient sensés être réguliers, devenaient aléatoires.

En me renseignant un peu plus, j'ai utilisé les tableaux de vertex (sf::VertexArray) pour dessiner mes rectangles de fond. Le problème a été réglé instantanément.
Par contre dès que j'essaye de remettre mon sf::Text par dessus, les bug reprennent.

J'ai cherché un moyen d'utiliser les vertex pour afficher des lettres, mais en vain.

Auriez-vous une idée de solution à ce problème ?

Merci d'avance :)

Pages: [1]