Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: yusera le Mai 13, 2012, 07:37:55 pm

Titre: Position d'un sprite
Posté par: yusera le Mai 13, 2012, 07:37:55 pm
Bonjour,
J'ai crée une petite GUI pour mon jeu (ici un bouton) et je rencontre un problème. En effet, j'ai un problème avec la position du sprite qui affiche le bouton. Si je lui attribue les coordonnées (500;300), il se positionne à (500;295). Donc ça crée un problème avec la gestion des événements (survole, clique ...).

La fonction qui reçoit la position du bouton et l'attribue au sprite du survole et du "non-survole" (par défaut) :
void Bouton::SetPosition(float px, float py)
{
        x = px;
        y = py;

        bt.setPosition(x,y);
        bt_hover.setPosition(x,y);

        texte.setPosition(x + (width/2 - texte.getGlobalBounds().width/2), y + (height/2 - texte.getGlobalBounds().height/2));
}

J'ai vérifié que x et y correspondaient bien aux paramètres que j'ai envoyé (on sait jamais).
Et la fonction qui initialise les sprites :
void Bouton::LoadImage(sf::Texture &img, sf::Texture &imgHover)
{
        bt.setTexture(img);

        width = img.getSize().x;
        height = img.getSize().y;

        bt_hover.setTexture(imgHover);
        if(bt_hover.getTexture() != NULL)
                isImgHover = true;
        else
                isImgHover = false;
}

Je précise que la différence entre la position envoyée et celle des sprites n'est pas constante (5 dans mon exemple) mais elle dépend de l'ordonnée (plus y augmente, plus la différence augmente).

Voilà, je vois pas d'où ça vient ...
Titre: Re : Position d'un sprite
Posté par: Arnibou le Mai 14, 2012, 10:01:19 pm
Regarde un peu par là:

http://fr.sfml-dev.org/forums/index.php?topic=7544.0 (http://fr.sfml-dev.org/forums/index.php?topic=7544.0) ou même http://fr.sfml-dev.org/forums/index.php?topic=7619.0 (http://fr.sfml-dev.org/forums/index.php?topic=7619.0)

Cela a déja été évoqué ;)
Titre: Re : Position d'un sprite
Posté par: yusera le Mai 16, 2012, 04:19:17 pm
Ouais mais là c'est pas un problème de centrage de texte mais l'image ne s'affiche pas à la position que j'ai envoyé.
Titre: Re : Position d'un sprite
Posté par: Orwel le Mai 16, 2012, 07:48:38 pm
On pourrait avoir des images...Je comprend mal le probléme :-[
Titre: Re : Position d'un sprite
Posté par: yusera le Mai 16, 2012, 08:57:43 pm
(http://www.imagup.com/data/1151860054.html)
http://www.imagup.com/data/1151860054.html
En gros, la barre grise a pour équation y=200 (je l'ai ajouté avec photofiltre) et on peut voir que le 1er bouton, bien que je lui ai passé en coordonnées (500;200), est plus bas que la barre. Donc il y a un léger problème ...
Titre: Re : Position d'un sprite
Posté par: yusera le Mai 18, 2012, 10:49:09 am
Je l'ai pas dit mais j'utilise la version 2.0.
Et je précise que j'avais déjà ce problème avec la version 1.6.
Titre: Re : Position d'un sprite
Posté par: Orwel le Mai 25, 2012, 11:27:36 pm
Peut-tu mettre le code complet de ton bouton(.h et .cpp)???
Titre: Re : Position d'un sprite
Posté par: yusera le Mai 26, 2012, 07:09:00 pm
GUIButton.hpp
#ifndef HEADER_GUI_BUTTON
#define HEADER_GUI_BUTTON

#include <SFML/Graphics.hpp>
#include "GUI.hpp"
#include <sstream>
#include <iostream>

using namespace std;

class Bouton
{
        public :
                Bouton(string text = "", sf::Color color = sf::Color(255, 255, 255));
                //~Bouton();
                void Draw(sf::RenderWindow &App);
                void LoadImage(string chemin, string cheminHover = "");
                void LoadImage(sf::Texture &img, sf::Texture &imgHover = sf::Texture());       
                int SetEvent(const sf::Event &e, sf::RenderWindow &App); // gestion des evenements
                void SetValue(string v);
                string GetValue();

                void SetText(string text);
                void SetTextColor(sf::Color color);
                void SetButtonSize(sf::Vector2i size);
                void SetPosition(float x, float y);
                void SetFont(const sf::Font &Font);
                void SetGoTo(int v);
                int GetGoTo();
                void SetVisibility(bool value);
                bool GetVisibility();
                void SetTextSize(int size);

        private :
                sf::Texture img_bt, img_bt_hover;
                sf::Sprite bt, bt_hover;
                sf::Text texte;

                string value;
                int width, height;
                bool visibility, isImgHover;
                int goTo;
                float x, y;
};

#endif

GUIButton.cpp
#include "GUIButton.hpp"

Bouton::Bouton(string text, sf::Color color) : value("none"), width(0), height(0), visibility(true), goTo(-1), x(0), y(0)
{
        texte.setString(text);
        texte.setColor(color);

        width = texte.getGlobalBounds().width;
        height = texte.getGlobalBounds().width;
}

void Bouton::Draw(sf::RenderWindow &App)
{
        if(visibility)
        {
                if(value == "hover" && isImgHover)
                        App.draw(bt_hover);
                else
                        App.draw(bt);

                App.draw(texte);
        }
}

void Bouton::LoadImage(string chemin, string cheminHover)
{
        img_bt.loadFromFile(chemin);
        bt.setTexture(img_bt);

        width = img_bt.getSize().x;
        height = img_bt.getSize().y;

        if(!cheminHover.empty())
        {
                img_bt_hover.loadFromFile(cheminHover);
                bt_hover.setTexture(img_bt_hover);
                isImgHover = true;
        }
        else
                isImgHover = false;
}

void Bouton::LoadImage(sf::Texture &img, sf::Texture &imgHover)
{
        img_bt = img;
        bt.setTexture(img_bt);

        width = img_bt.getSize().x;
        height = img_bt.getSize().y;

        img_bt_hover = imgHover;
        bt_hover.setTexture(img_bt_hover);
        if(bt_hover.getTexture() != NULL)
                isImgHover = true;
        else
                isImgHover = false;
}

int Bouton::SetEvent(const sf::Event &e, sf::RenderWindow &App)
{
        if(visibility) // On utilise e lorsque le bouton est visible
        {
                // Renvoie clique si on clique sur le bouton ou si on appuie sur ENTRER lorsque le bouton est survolé
                if((sf::Mouse::isButtonPressed(sf::Mouse::Left) && sf::Mouse::getPosition(App).x >= x && sf::Mouse::getPosition(App).x <= x+width
                        && sf::Mouse::getPosition(App).y >= y && sf::Mouse::getPosition(App).y <= y+height) || ((e.type == sf::Event::KeyPressed) && (e.key.code == sf::Keyboard::Return) && value == "hover"))
                                return CLICKED;
               
                // SOURIS
                if(isImgHover) // Si il y a une image lors du passage de la souris
                {
                        // Si la souris est sur le bouton
                        if((sf::Mouse::getPosition(App).x >= x && sf::Mouse::getPosition(App).x <= x+width)
                        && (sf::Mouse::getPosition(App).y >= y && sf::Mouse::getPosition(App).y <= y+height))
                        {
                                SetValue("hover");
                                return SURVOL;
                        }
                        else
                                SetValue("none");
                }
        }
        return -1; // Il n'y a pas d'évènement
}

void Bouton::SetValue(string v)
{
        if(!v.empty() && value != v)
                value = v;
}

string Bouton::GetValue()
{
        return value;
}

void Bouton::SetText(string text)
{
        texte.setString(text);
}

void Bouton::SetTextColor(sf::Color color)
{
        texte.setColor(color);
}

void Bouton::SetButtonSize(sf::Vector2i size)
{
        width = size.x;
        height = size.y;
}

void Bouton::SetPosition(float px, float py)
{
        x = px;
        y = py;
       
        bt.setPosition(x,y);
        bt_hover.setPosition(x,y);

        texte.setPosition(x + (width/2 - texte.getGlobalBounds().width/2), y + (height/2 - texte.getGlobalBounds().height/2));
}

void Bouton::SetFont(const sf::Font &Font)
{
        texte.setFont(Font);
}

void Bouton::SetGoTo(int v)
{
        goTo = v;
}

int Bouton::GetGoTo()
{
        return goTo;
}

void Bouton::SetVisibility(bool value)
{
        visibility = value;
}

bool Bouton::GetVisibility()
{
        return visibility;
}

void Bouton::SetTextSize(int size)
{
        texte.setCharacterSize(size);
}
Titre: Re : Position d'un sprite
Posté par: Orwel le Mai 30, 2012, 09:52:10 pm
Que représente l'attribut :int width, height;

Un coups c'est la taille du texte(cf Constructeur), plus loins la taille d'une texture(cf LoadImage).

Puis bt_hover et bt???

Puis la fonction :
 
void Bouton::SetButtonSize(sf::Vector2i size)
{
        width = size.x;
        height = size.y;
}
 

La maintenant c'est associé à plus nada.
Titre: Re : Position d'un sprite
Posté par: yusera le Mai 31, 2012, 09:05:06 pm
int width : la longueur du bouton
int height : la largeur du bouton

Ça me semble pas compliqué à comprendre.
Je les initialise avec la taille du texte dans le constructeur au cas où le bouton ne possède pas de texture. Comme ça le bouton aura pour taille la taille du texte.

Citer
Puis bt_hover et bt???
sf::Sprite bt : image du bouton.
sf::Sprite bt_hover : image du bouton lors du survole de la souris.

Sinon la fonction SetButtonSize(sf::Vector2i size) permet simplement de modifier la taille du bouton si la taille ne convient pas.
Je précise que cette classe reste "brouillon", elle sera améliorer mais pour le moment je reste simple vu que je suis confronté à un problème (sujet du topic)
Titre: Re : Position d'un sprite
Posté par: yusera le Juin 03, 2012, 09:53:04 am
J'ai trouvé la solution, cela vient de sf::View de la fonction main() :
sf::RenderWindow App(sf::VideoMode(1024, 768, 32), "titre", sf::Style::Close);
sf::View view(sf::FloatRect(0, 0, 1024, 768));

Mais vu que view fait la même taille que App, pourquoi il y a-t-il un décalage vertical ?
Titre: Re : Position d'un sprite
Posté par: G. le Juin 03, 2012, 02:46:56 pm
Dans le constructeur, donner la valeur de width à height me parait étrange.
Titre: Re : Re : Position d'un sprite
Posté par: yusera le Juin 04, 2012, 08:12:52 pm
Dans le constructeur, donner la valeur de width à height me parait étrange.
En effet merci je n'avais pas fait gaffe.
Mais le problème ne venait pas de là (il est résolu mais j'ai encore une question, cf. mon poste précédent)
Titre: Re : Position d'un sprite
Posté par: Bigz le Juin 05, 2012, 09:34:00 am
Heu, tu devrais pas la centrer au milieu de ta fenêtre ta vue ?
Titre: Re : Position d'un sprite
Posté par: yusera le Juin 06, 2012, 02:02:14 pm
Tu veux que je fasse ça ?
sf::View view(sf::FloatRect(0, 0, 1024, 768));
view.setCenter(1024/2,768/2);

Ça ne change rien.
Pour le moment ce n'est pas grave vu que je peux simplement supprimer la vue mais lorsque il va y avoir plusieurs résolutions, je vais en avoir besoin.
Titre: Re : Position d'un sprite
Posté par: G. le Juin 06, 2012, 03:52:24 pm
Tu devrais nous montrer un code réduit au maximum qui reproduit le problème, histoire qu'on puisse copier/coller le code en un seul coup et constater le résultat.
Titre: Re : Position d'un sprite
Posté par: yusera le Juin 10, 2012, 08:36:36 pm
Je vous posterai un code minimal une fois que j'aurai le temps (avec les études)