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 - Rick_Cplusplus

Pages: [1] 2 3 Suivante »
1
Bonjour la communauté,

Dans le descriptif de la classe sf:: mouse il est dit :

Quote:
static Vector2i sf::Mouse::getPosition ( const Window & relativeTo)    

Get the current position of the mouse in window coordinates.
This function returns the current position of the mouse cursor, relative to the given window.
(...)
UnQuote.

Chaque window a une vue par defaut (defaultView).
Mais lorsqu'il existe plusieurs vues pour une window, sf::Mouse::getPosition renvoie-t-il les coordonnées du curseur de la souris par rapport à la vue par défaut (defaultView) ou par rapport à la vue courante (celle activée par setView) ?

Rick.

2
Parce que prevMouse est identique à ce que tu vas récupérer dans Event::MouseMoved, de toute évidence.
Certes, c'est ce que me disait le debugger mais cela causait mon désaroi...

Un "vrai" prevMouse serait mis à jour dans Event::MouseMoved, juste après avoir utilisé les coordonnées.
Ah Il s'agit donc d'un mauvais positionnement de prevMouv dans le code...  ::)

Sinon j'aime bien leftButtonPressed et leftButtonReleased. Tu ne crois pas qu'il y a un truc qui sert légèrement à rien là-dedans ? ;)
Si,si, mais qd je suis perdu je tente des trucs fous pour voir ; l'espoir fait coder... ;D

Quoi qu'il en soit, j'ai pu venir à bout de ce Pb grace à Toi. Merci encore pour ce soutien efficace et rapide. :)
Rick.

3
Bonjour la comunauté,

J'ai un petit souci avec ce code (j'ai essayé de le rendre minimal) :

#include <iostream>
#include <math.h>
#include <vector>
#include <SFML/Graphics.hpp>

class Hexagone
{
    public:
        Hexagone(unsigned int, unsigned int, double);

        unsigned int q; // no ligne
        unsigned int r; // rang dans la ligne

        double m_rayon; // rayon de l'hexagone

        sf::ConvexShape polygon; // drawable representant l'hexagone

    private:

};


Hexagone::Hexagone(unsigned int q = 0, unsigned int r = 0, double rayon = 0): q(q), r(r), m_rayon(rayon), polygon(6)
{

    const double PI = 3.14159265358979323846;
    double theta(0);

    // parametrage du polygone
    for(unsigned int i(0); i<6; i++)
    {
        theta = (60 * i + 30)* PI / 180;
        polygon.setPoint(i, sf::Vector2f(m_rayon * cos(theta), m_rayon * sin(theta)));
    }
    polygon.setOutlineColor(sf::Color::Black);
    polygon.setOutlineThickness(-2);
    if(r%2 == 0) polygon.setFillColor(sf::Color::Blue);
    else polygon.setFillColor(sf::Color::Green);
}

class Carte
{
    public:
        Carte(unsigned int, unsigned int);

        void dessine(sf::RenderWindow &); // dessine les hexagones (dessine la carte)

        unsigned int m_nbhex; // nombre d'hexagones par ligne
        unsigned int m_nblg; // nombre de lignes

        unsigned int m_lx; // taille X du mode fenetre pour affichage de la carte
        unsigned int m_ly; // taille Y du mode fenetre pour affichage de la carte
        double m_r; // rayon des hexagones calculé en fonction de la fenêtre

        double m_ech; // echelle d'affichage

        std::vector <Hexagone*> listHex; // conteneur des pointeurs vers les hex

    private:

};

Carte::Carte(unsigned int nblg, unsigned nbhex): m_nbhex(nbhex), m_nblg(nblg), m_lx(0), m_ly(0), m_r(0), m_ech(1), listHex{}
{
    //recuperation du mode fenetre de la carte
    std::vector<sf::VideoMode> modes = sf::VideoMode::getFullscreenModes();

    // choix du mode le plus grand apres le mode full screen
    sf::VideoMode mode = modes[1];

    m_lx = mode.width;
    m_ly = mode.height;

    // determination du rayon des hex svt taille fenetre
    double rx = m_lx / (sqrt(3) * (nbhex + .5));
    double ry = m_ly / (1.5 * (nblg - 1) + 2);
    m_r = rx;
    if (ry < rx) m_r = ry;

    // instantiation des hexagones
    for(unsigned int i(0); i<m_nblg; i++)
    {
        for(unsigned int j(0); j<m_nbhex; j++)
        {
            Hexagone *hex = new Hexagone(i, j, m_r);
            listHex.push_back(hex);
        }
    }

    //definition de la taille de la fenetre
    m_lx = nbhex * m_r * sqrt(3) + m_r * sqrt(3) / 2;
    m_ly = m_r * (2 + 1.5 * (nblg - 1));
}


void Carte::dessine(sf::RenderWindow &fenetre)
{
    double offset(0);

    for(unsigned int i(0); i < listHex.size(); i++)
    {
        if(listHex[i] -> q % 2 == 0) offset = sqrt(3) * m_r;
        else offset = sqrt(3) * m_r / 2;
        listHex[i] -> polygon.setPosition(((sqrt(3) * m_r * listHex[i] -> r) + offset), ((1.5 * m_r * listHex[i] -> q) + m_r));

        fenetre.draw(listHex[i] -> polygon);
    }
    return;
}


int main()
{
    // instantiation Carte
    unsigned nbhex = 50;
    unsigned int nblg = 20;
    Carte *carte = new Carte(nblg, nbhex);

    // creation fenetre
    bool pleinEcran = false;
    sf::RenderWindow fenetre;
    auto style = (pleinEcran ? sf::Style::Fullscreen : sf::Style::Default);
    fenetre.create({carte -> m_lx, carte -> m_ly, 32}, "Carte", style);

    // creation de la vue et de son viewport
    sf::View view1 = fenetre.getDefaultView();
    view1.setViewport(sf::FloatRect(0,0,.9,1));
    fenetre.setView(view1);

    sf::Vector2i prevMouse(0 , 0);

    bool leftButtonPressed(false);
    bool leftButtonReleased(true);

    while(fenetre.isOpen())
    {
        // memorisation position souris en début de frame
        prevMouse = sf::Mouse::getPosition(fenetre);

        // gestion des evenements
        sf::Event event;
        while (fenetre.pollEvent(event))
        {
            // detection et fermeture fenetre
            if (event.type == sf::Event::Closed)
            {
                fenetre.close();
            }

            // detection click button gauche
            if (event.type == sf::Event::MouseButtonPressed)
            {
                if (event.mouseButton.button == sf::Mouse::Left)
                {
                    leftButtonPressed = true;
                    leftButtonReleased = false;
                }
            }

            // detection de-click button gauche
            if (event.type == sf::Event::MouseButtonReleased)
            {
                if (event.mouseButton.button == sf::Mouse::Left)
                {
                    leftButtonPressed = false;
                    leftButtonReleased = true;
                }
            }

            // Ici il a du code pour zoomer / dé zoomer qui fonctionne bien donc je l'ai enlevé...
            {
            // code qui fonctionne...
            }

            // si bouton gauche maintenu, deplacement vue
            if(event.type == sf::Event::MouseMoved && leftButtonPressed)
            {
                sf::Vector2f dpl(prevMouse.x - event.mouseMove.x, prevMouse.y - event.mouseMove.y); // <- ici dpl vaut (0, 0) et je ne comprend pas pourquoi...
                view1.move(dpl);
            }

        }
        //effacement
        fenetre.clear(sf::Color::Black);

        //MaJ vue
        fenetre.setView(view1);

        //dessin
        carte -> dessine(fenetre);

        //affichage
        fenetre.display();
    }
    return 0;
}
 

Les 2 classes (les attributs "public" ne le resteront pas à terme bien sûr  ;)) sont opérantes et ne font pas parti de mon pb, je ne les ai laissées que pour l’exhaustivité du code.

Ce que je n'arrive pas à comprendre, c'est pourquoi le vecteur dpl vaut (0, 0) (voir commentaire dans le main) alors que la souris a bougée...
Une piste à me suggérer ?

Si mon approche est incorrecte, existe t-il une meilleure façon de procéder pour déplacer la vue d'un vecteur correspondant au mouvement de la souris entre 2 frames lorsque le bouton gauche de la souris est maintenu appuyé entre ces 2 frames ?

Rick.

4
Bonjour la communauté,

Mon code, compile et s’exécute correctement mais la console me renvoie le message ci-après :

An internal OpenGL call failed in Texture.cpp(98).
Expression:
   glFlush()
Error description:
   GL_INVALID_OPERATION
   The specified operation is not allowed in the current state.

Process returned 0 (0x0)   execution time : 14.212 s
Press any key to continue.


Apparemment cela se passe dans Texture. CPP à la ligne 98 (un flush non autorisé ?..)

En exécution pas à pas, il semble que cela arrive au moment de la construction d'une fenêtre qui fait appel à une texture passée par référence à une texture auparavant crée suite à un chargement (réussi) depuis un fichier... Bizarre  :o
Une idée ?

Rick.

5
Graphique / Re: Affichage sf::Text retourné d'une fonction
« le: Août 07, 2019, 08:12:04 pm »
Bien après un (long) processus essai erreur j'arrive à ça :

Le header :
#ifndef FENETRE_H
#define FENETRE_H

#include <string>
#include <SFML/Graphics.hpp>

class Fenetre
{
    public:

        // Constructeur & Destructeur
        Fenetre(const std::string &, const sf::Vector2u &);
        ~Fenetre();

        // methode statique
        static bool chargeFont(std::string const &);

        //Accesseurs
...

        // methode
...

    private:
        // attribut
        static sf::Font fontFenetre; // Font des sf::Text des fenetres
...

};

#endif // FENETRE_H

le CPP :
#include "Fenetre.h"

sf::Font Fenetre::fontFenetre; // declaration de la font

Fenetre::Fenetre(const std::string &titre, const sf::Vector2u &taille) :
...
{

}

Fenetre::~Fenetre()
{

}

bool Fenetre::chargeFont(std::string const & fichier) // Methode statique
{
    return (Fenetre::fontFenetre.loadFromFile(fichier.c_str()));
}

 

Et dans le main :
#include <SFML/Graphics.hpp>
#include "Fenetre.h"

int main()
{
    // chargement d'une font (et verif succès)
    if(!Fenetre::chargeFont("Arial.ttf"))
    {
        std::cerr << "Fichier Arial.ttf introuvable" << std::endl;
        return -1;
    }
...
return 0;
 

Ainsi toutes les fenêtres crées ont la même font et Fenêtre::fontFenetre reste "vivant" au long de l'application. :)
Y'a peut être mieux mais je n'ai pas trouvé. ;)

Rick.

Rick.

6
Graphique / Re: Affichage sf::Text retourné d'une fonction
« le: Août 07, 2019, 05:36:30 pm »
Aaaah voilà ; le mystère se dissipe... :D
Effectivement j'ai cherché partout sauf sur la doc de sf::Font ! :-\
Merci pour ce "rappel".  ;)
Du coup,  il serait peut être pertinent :

1) de faire de "font" une variable statique public dans chaque classe ayant un attribut de type sf::Text et d’initialiser cette variable statique avec une méthode (statique elle aussi) vérifiant que la font est bien là ou on l'appelle.

Ou bien

2) de faire de "font" une variable statique initialisée de même dans un namespace et d'inclure le namespace dans chaque header de classe ayant un attribut de type sf:Text pour appeler la variable qd nécessaire.

Ou bien

3) faire autrement... Mais quoi ?

Qu'est-ce qui se fait d'habitude en "bonne pratique" ?

Rick.

7
Graphique / Affichage sf::Text retourné d'une fonction
« le: Août 06, 2019, 03:14:48 pm »
Bonjour la communauté,

En raffinant au maximum mon problème d'affichage de sf::text de mon dernier post , j'arrive à ceci :
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Fenetre.h"

sf::Text dessineText(unsigned int const htr = 20)
{
    sf::Font font;
    font.loadFromFile("Arial.ttf");
    std::string duTexte("essai");
    sf::Text texte(duTexte, font, htr);
    return texte;
}

int main()
{
    Fenetre *pFenetre = new Fenetre("Ma fenetre", sf::Vector2u (1024, 768));

    sf::Text texte;
    texte = dessineText();

    while(!pFenetre -> fini())
    {
        pFenetre -> evenement();
        pFenetre -> efface();
        pFenetre -> dessine(texte); //<=  là il se perd en conjectures (et moi aussi)...
        pFenetre -> affiche();
    }

    delete pFenetre;
    return 0;
}

Le code de ma classe fenêtre ne semble pas en cause.
A tout hasard, voici le header :
#ifndef FENETRE_H
#define FENETRE_H

#include <string>
#include <SFML/Graphics.hpp>

class Fenetre
{
    public:
        Fenetre(const std::string &, const sf::Vector2u &);
        ~Fenetre();

        // Methode
        void efface(); // efface le contenu de la fenetre
        void dessine(sf::Drawable &drawable); // dessine un objet dessinable
        void affiche(); // affiche le contenu de la fenetre
        void evenement(); // gère les evenemente et met à jour la fenetre
        bool fini(); // retourne le statut ouvert ou ferme de la fenetre

    private:
        //Methode
        void configure(); // configuration de la fenêtre (titre et taille)
        void ferme(); // ferme la fenêtre

        // Attribut
        sf::RenderWindow m_fenetre; // fenêtre créé par la classe
        sf::Vector2u m_taille; // taille de la fenêtre
        std::string m_titre; // titre de la fenêtre
        unsigned int m_bpp; // nb de bit par pixel
        bool m_fini; // statut ouvert / fermé de la fenêtre
};

#endif // FENETRE_H

Et le CPP associé :
#include "Fenetre.h"

Fenetre::Fenetre(const std::string &titre, const sf::Vector2u &taille) :
m_fenetre(), m_taille(taille), m_titre(titre), m_bpp(32), m_fini(false)
{
    configure();
}

Fenetre::~Fenetre()
{
        ferme();
}

void Fenetre::configure()
{
    m_fenetre.create({m_taille.x, m_taille.y, m_bpp}, m_titre, sf::Style::Default);
    return;
}

void Fenetre::ferme()
{
    m_fenetre.close();
    return;
}

void Fenetre::evenement()
{
    sf::Event event;
    while (m_fenetre.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
        {
            m_fini = true;
        }
    }
    return;
}

void Fenetre::efface()
{
    m_fenetre.clear(sf::Color::Black);
    return;
}

void Fenetre::dessine(sf::Drawable &drawable)
{
    m_fenetre.draw(drawable);
    return;
}

void Fenetre::affiche()
{
    m_fenetre.display();
    return;
}

bool Fenetre::fini()
{
    return this -> m_fini;
}

Le code compile (hélas :'( ) mais l’exécution plante.
En usant du debugger pas à pas, la ligne fatale est celle appelant la méthode "dessine" qui tente d'exécuter :
m_fenetre.draw(drawable);

Le debugger indique alors :
#0 0x69162e5c   std::less<unsigned int>::operator() (this=0x28fb44, __x=<error reading variable>, __y=@0x28f9b0: 20) (C:/Dev/MinGW32-PosixDwarf730r0/lib/gcc/i686-w64-mingw32/7.3.0/include/c++/bits/stl_function.h:386)

Ce qui pour moi est inintelligible..
Voilà, si quelqu'un a une idée, moi je sèche... :-\

Rick.

8
Graphique / Implementer la classe drawable
« le: Août 02, 2019, 09:57:01 am »
Bonjour la comunauté,

Bon je reviens là dessus pke je sèche sur un pb.
voici le code (minimal) du header :
#ifndef BOUTON_H
#define BOUTON_H

#include <string>
#include <SFML/Graphics.hpp>

class Bouton : public sf::Drawable
{
    public:

        Bouton(sf::Vector2f, const std::string &, unsigned int, unsigned int = 255, unsigned int = 255, unsigned int = 255); // constructeur

        sf::Font m_font;
        sf::Vector2f m_position; // position du bouton ("ligne de base" et gauche) / sa fenetre
        unsigned int m_rouge; // couleur rouge fond bouton
        unsigned int m_vert; // couleur vert fond bouton
        unsigned int m_bleu; // couleur bleu fond bouton

        sf::Text m_legende; // texte qui apparait sur le bouton
        sf::RectangleShape m_rect; // rectangle représentant le bouton

    private:

        void draw(sf::RenderTarget&, sf::RenderStates = sf::RenderStates::Default) const; // la méthode de la classe virtuelle à implémenter
};

#endif // BOUTON_H
 

Le CPP associé :

#include "Bouton.h"

Bouton::Bouton(sf::Vector2f position, const std::string &legende, unsigned int htrText, unsigned int rouge, unsigned int vert, unsigned int bleu) : m_position(position), m_rouge(rouge), m_vert(vert), m_bleu(bleu) //constructeur
{

    m_font.loadFromFile("Arial.TTF");
    m_legende.setFont(m_font);
    m_legende.setCharacterSize(htrText);

    m_legende.setOutlineThickness(0);
    m_legende.setOutlineColor(sf::Color::White);
    m_legende.setFillColor(sf::Color::Black);
    m_legende.setString(legende);
    m_legende.setOrigin(m_legende.getLocalBounds().width / 2, 0);
    m_legende.setPosition(position);

    m_rect.setOutlineColor(sf::Color::Black);
    m_rect.setOutlineThickness(5);
    m_rect.setFillColor(sf::Color (m_rouge, m_vert, m_bleu));
    m_rect.setSize(sf::Vector2f(m_legende.getLocalBounds().width, m_legende.getLocalBounds().height));
    m_rect.setOrigin(m_rect.getLocalBounds().width / 2, 0);
    m_rect.setPosition(position.x, position.y + m_legende.getLocalBounds().top);
}

void Bouton::draw(sf::RenderTarget& fenetre, sf::RenderStates) const
{
    fenetre.draw(m_rect);
    fenetre.draw(m_legende);
}
 

J'ai mis les variable en "Public", je sais c'est mal, mais c'est évidement provisoire. ;)

Ensuite j'ai une classe fenêtre qui est composée de la classe bouton. les boutons sont placés dans un vector (le nombre de bouton étant variable d'une instance de fenêtre à l'autre).

Le header de la classe fenetre :

#ifndef FENETRE_H
#define FENETRE_H

#include <iostream>
#include <string>
#include <vector>
#include <SFML/Graphics.hpp>

#include "Bouton.h"

class Fenetre
{
    public:
        Fenetre(const std::string &, const sf::Vector2u &, unsigned int); // constructeur
        Fenetre(const std::string &titre, const sf::VideoMode &Mode, unsigned int numero); // constructeur
        ~Fenetre();

        // methode
        void efface(); // efface le contenu de la fenêtre
        void dessine(sf::Drawable &drawable); // dessine un objet "dessinable"
        void affiche(); // affiche le contenu de la fenêtre

        void evenement(); // gère les événement et met à jour la fenêtre

        void ouvre(unsigned int); // ouvre la fenêtre
        void configure(const std::string &titre, const sf::Vector2u &taille, unsigned int); // configuration de la fenêtre (titre, taille et n° d'ordre d'ouverture)

        void addBouton(sf::Vector2f, std::string, unsigned int, unsigned int = 255, unsigned int = 255, unsigned int = 255); // ajoute un bouton à la fenêtre (position et texte)

        void ferme(); // ferme la fenêtre

        bool fini(); // retourne le statut ouvert ou ferme de la fenêtre

        bool getEtatBouton(unsigned int); // retourne l'état du bouton n° uint de la fenêtre

        // attribut - membre
        sf::RenderWindow m_fenetre; // fenêtre crée par la classe
        sf::Vector2u m_taille; // taille de la fenêtre
        std::string m_titre; // titre de la fenêtre
        unsigned int m_bpp; // nb de bit par pixel
        unsigned int m_no; // numéro d'ordre de fenêtre (ordre d'ouverture)

        bool m_fini; // statut ouvert / fermé de la fenêtre

        unsigned int m_nbBouton; // nombre de bouton de la fenêtre
        std::vector <Bouton> m_vBouton; // vecteur contenant les boutons de la fenêtre
        std::vector <bool> m_vEtatBouton; // vecteur contant l'état des boutons

        sf::Vector2u m_sPos; // position de la souris

    private:

};
#endif // FENETRE_H
 

Et le CPP qui implémente :

#include "Fenetre.h"

Fenetre::Fenetre(const std::string &titre, const sf::Vector2u &taille, unsigned int numero) // c(a)stor
{
    configure(titre, taille, numero);
}

Fenetre::Fenetre(const std::string &titre, const sf::VideoMode &Mode, unsigned int numero) // constructeur
{
    configure(titre, sf::Vector2u(Mode.width, Mode.height), numero);
}

void Fenetre::configure(const std::string &titre, const sf::Vector2u &taille, unsigned int numero)
{
    m_titre = titre;
    m_taille = taille;
    m_no = numero;
    m_fini = false;

    ouvre(numero);

    m_bpp = 32;
}

Fenetre::~Fenetre(){ ferme();}

void Fenetre::addBouton(sf::Vector2f position, std::string legende, unsigned int htrText, unsigned int rouge, unsigned int vert, unsigned int bleu)
{
    Bouton bouton(position, legende, htrText, rouge, vert, bleu);
    m_vBouton.push_back(bouton);
    m_vEtatBouton.push_back(false);
}

bool Fenetre::getEtatBouton(unsigned int numero)
{
    return m_vEtatBouton[numero];
}

void Fenetre::ouvre(unsigned int numero)
{
    if(numero == 0) m_fenetre.create(sf::VideoMode::getDesktopMode(), m_titre, sf::Style::Fullscreen);
    else m_fenetre.create({m_taille.x, m_taille.y, m_bpp}, m_titre, sf::Style::Default);
}

void Fenetre::ferme()
{
    m_fenetre.close();
}

void Fenetre::evenement()
{
    // on inspecte tous les evenements de la fenêtre qui ont ete emis depuis la precedente iteration
    sf::Event event;
    while (m_fenetre.pollEvent(event))
    {
        // evenement "fermeture demandee" : on ferme la fenêtre
        if (event.type == sf::Event::Closed)
            {
            m_fini = true;
            }

        // evenement mouseclick
        if (event.type == sf::Event::MouseButtonPressed)
        {
            // click gauche...
            if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
            {

                // vérif et mise à jour des boutons fenetre (cliqué ou non) ?
                for(unsigned int i = 0; i < m_vBouton.size(); i++)
                {
                    m_sPos.x = sf::Mouse::getPosition(m_fenetre).x;
                    m_sPos.y = sf::Mouse::getPosition(m_fenetre).y;
                    m_vBouton[i].active(m_sPos);
                }
            }
        }

        // evenement bouton relache
        if (event.type == sf::Event::MouseButtonReleased)
        {
                // activation action lié au bouton ?
                for(unsigned int i = 0; i < m_vBouton.size(); i++)
                {
                    m_sPos.x = sf::Mouse::getPosition(m_fenetre).x;
                    m_sPos.y = sf::Mouse::getPosition(m_fenetre).y;
                    m_vBouton[i].desactive(m_sPos);
                    m_vEtatBouton[i] = true;
                }
        }

    }
}

void Fenetre::efface()
{
    for(unsigned int i = 0; i < m_vBouton.size(); i++)
    {
        m_vEtatBouton[i] = false;
    }
    m_fenetre.clear(sf::Color::Black);
}

void Fenetre::dessine(sf::Drawable &drawable)
{
    m_fenetre.draw(drawable);
}

void Fenetre::affiche()
{
    for(unsigned int i = 0; i < m_vBouton.size(); i++)
    {
        m_fenetre.draw(m_vBouton[i]);
    }
    m_fenetre.display();
}

bool Fenetre::fini()
{
    return this -> m_fini;
}
 

Le pb c'est que ça compile...  :-\

Mais lorsque j'instancie une fenetre depuis le main() que j'y ajoute un bouton et que je lance une boucle while "fenetre ouverte", le code plante lors de l'appel au dessin du bouton.
m_fenetre.draw(m_vBouton[i]);

dans Fenetre::affiche() et je suis pas capable de comprendre pourquoi... Je suspecte une mauvaise définiton de la classe bouton héritant de la classe vrtuelle sf::drawable mais je sèche sur le debogage.

En grattant encore un peu je me suis rendu compte que m_rect s'affiche mais pas m_legende.
void Bouton::draw(sf::RenderTarget& fenetre, sf::RenderStates) const
{
    fenetre.draw(m_rect);
    fenetre.draw(m_legende);
}
 
m_legende est pourtant un sf::Text défini par le constructeur du bouton.

Une idée ?

Rick.

P.S : DSL pour le code "en vrac", j'ai essayé mais ce n'est pas facile de faire un code "minimal"

9
Fenêtrage / Re: Doute sur MouseButtonPressed et MouseButtonReleased
« le: Août 02, 2019, 08:04:52 am »
Ok c'est plus clair.
Merci pour ces précisions Mister G.  :)

Rick.

10
Fenêtrage / Doute sur MouseButtonPressed et MouseButtonReleased
« le: Août 01, 2019, 10:25:18 pm »
Bonsoir la communauté,

Les tutoriels sont vraiment bien fait mais j'ai du mal à lever un doute sur le fonctionnement des évènements MouseButtonPressed et MouseButtonReleased

Le tuto dit :
Les évènements sf::Event::MouseButtonPressed et sf::Event::MouseButtonReleased sont déclenchés lorsqu'un bouton souris est pressé/relâché.

Ok mais ce que je cherche à comprendre c'est si ces événements signalent un front montant / descendant (le bouton de la souris change d'état) ou un statut (le bouton de la souris est à l'état pressé / relâché).

Autrement dit, si je code :

int i(0);
sf::Event event;
    while (m_fenetre.pollEvent(event))
    {
         if (event.type == sf::Event::MouseButtonPressed)
        {
            // click gauche...
            if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
            {

                i++
               
            }
        }
    }
 

et que durant l’exécution je maintiens le bouton gauche de la souris appuyé, mon i s'incrémente-il une seule fois ou une fois par frame ?

Rick.

11
Général / Re: Update GCC - faut-il reinstaller SFML ?
« le: Juillet 31, 2019, 06:58:44 pm »
Merci G pour ta réponse rapide,

Bon sang j'avais zappé la recommandation que tu cites en premier. DSL  :-[
J'avais bien lu la seconde phrase mais ça me fait un peu peur de recompiler. :-\

Je vais déjà réinstaller SFML avec la version GCC 7.3 on va bien voir.
Qd à créer un template C::B, je ne vois pas trop comment faire mais je vais me pencher sur ça pke c'est vrai que c'est pénible de refaire toutes les manip "à la main" à chaque nouveau projet...

Merci et encore DSL pour le dérangement, certains réflexes me sont encore à acquérir... ::)
Rick

12
Général / Update GCC - faut-il reinstaller SFML ?
« le: Juillet 31, 2019, 06:28:53 pm »
Bonjour la communauté,

Je viens de faire un update de GCC (8.2.0) et je l'ai "rattaché" à Code::Blocks (17.12).
Lorsque je compile un code type hello world", pas de pb. 8)

Lorsque je compile un code plus complexe appelant les fonctions de la SFML, le compilateur me dit :

ld.exe||cannot find -lsfml-graphics-d|
ld.exe||cannot find -lsfml-window-d|
ld.exe||cannot find -lsfml-system-d|

 :-\

Du coup je me pose 2 questions :
- GCC 8.2.0 gère t-il SFML ? (j'espère...)
- Dois-je ré-installer SFML dans mon projet en suivant le tuto d'installation "SFML et Code::Blocks (MinGW)" ?

Rick.


 

13
Graphique / Re: sf::Text + sf::RectangleShape => sf::sprite ?
« le: Juillet 19, 2019, 10:04:16 am »
Bonjour la communauté,

Bidon ? Pas tant que ça pour mon niveau actuel... :P

Mais bon, je me suis lancé et j'y suis arrivé !
- Merci aux codes proposés dans le wiki (roundedRectangle et lineShape),
- Merci à l'exemple fourni avec la classe sf::Shape,
- Merci à Mister G pour l'incitation au dépassement !  ;)

Reste une chose que je n'ai pas comprise, c'est le sens de "virtual" dans :
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
tiré de l'exemple là ->  https://www.sfml-dev.org/documentation/2.5.1-fr/classsf_1_1Drawable.php

Je ne l'ai pas mis ce "virtual" et ça fonctionne tout de même, donc quid de la chose ? ???

Rick

14
Graphique / Heritage de la classe drawable
« le: Juillet 17, 2019, 04:59:35 pm »
Bonjour la communauté,

Je souhaite faire une classe bouton (pas original mais utile).
cette classe a, entre autre, 2 membres :
- un sf::Text qui contient le texte à afficher sur le bouton,
- un sf::RectangleShape qui entoure le texte pour rendre visible le bouton.

Question : puis-je combiner (si oui comment ?) ces 2 membres pour constituer un sf::Sprite à retourner à ma fenêtre pour l'affichage du bouton ou suis-je obligé de retourner les 2 membres via 2 "getter" séparés ?  ???

Une alternative serait de faire hériter ma classe bouton de sf::Drawable mais ça me fait un peu peur en terme de syntaxe... :-[
Salutations,

Rick.

15
Fenêtrage / Re: Imbriquer des events, possible ou pas ?
« le: Juillet 12, 2019, 02:42:15 pm »
Ok vu !  ;)

C'est ce que je viens de faire et devinez ?
Ça marche parfaitement ! 8)

Merci Mister G.  :D
Rick.

Pages: [1] 2 3 Suivante »