-
Bonjour, j'ai recemment un problème pour faire un bouton en utilisant la SFML.
Ce que je veux faire c'est essayé de faire du code pour faire en sorte que pour pouvoir afficher un bouton, une police, ou une texture par exemple, il suffit d'ajouter une ligne de code dans le programme. Pour l'instant c'est très mal codé car je suis débutant mais je compte arranger ça :). Donc du coup j'ai commencé par le bouton mais me voila avec ce problème.
Voici le code de la fonction de ma fenetre :
void WinConfig::whileGame() {
while(m_window.isOpen())
{
sf::Event event;
while(m_window.pollEvent(event))
{
switch(event.type)
{
case sf::Event::MouseButtonPressed:
if (buttonEnter.eventMouse(event.mouseButton.x,
event.mouseButton.y))
{
std::cout << "Test" << std::endl;
}
break;
case sf::Event::Closed:
m_window.close();
default:
break;
}
}
m_window.clear(sf::Color::Black);
m_component->draw(&m_window);
m_window.display();
}
}
C'est a l'endroit du case sf::Event::MouseButtonPressed:
Voici le code de la fonction eventMouse :
bool Button::eventMouse(int x, int y)
{
sf::Vector2f point(x,y);
sf::FloatRect boundingBox = m_spriteButton.getGlobalBounds();
return boundingBox.contains(point);
}
Je vous remercie de votre aide :)
-
me voila avec ce problème
Lequel ? :-\
-
De justement rendre mon bouton clickable. Quand j'appuies sur le sprite, rien ne se passe :/
-
Ok.
Je vois à priori aucun problème dans la partie de code que tu as donnée.
Si ta vue (sf::View) a subi des transformations, pense à utiliser mapPixelToCoords (http://www.sfml-dev.org/tutorials/2.4/graphics-view-fr.php#conversions-de-coordonncees).
-
Ha.. Ca ne marche peut-être pas car j'utilise pas sf::View ^^'
-
Non, ça doit être autre chose, qu'on ne voit pas dans le morceau de code donné.
-
Dans ce cas voici la suite du code :
#include "Button.hpp"
Button::Button() {
//NONE
}
Button::~Button() {
//NONE
}
void Button::create(std::string id, int x, int y, sf::Texture * texture1) {
m_spriteButton.setTexture(*(texture1));
m_spriteButton.setPosition(x,y);
m_idButton = id;
}
bool Button::eventMouse(int x, int y)
{
sf::Vector2f point(x,y);
sf::FloatRect boundingBox = m_spriteButton.getGlobalBounds();
return boundingBox.contains(point);
}
sf::Sprite Button::retSprite() {
return m_spriteButton;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Component.hpp"
Component::Component() {
}
Component::~Component() {
}
void Component::create(ManagerGroup * ptr_managerGroup) {
buttonEnter.create("buttonChangCode", 50, 80,
ptr_managerGroup->ptr_textureManager->getTexture("changCode"));
}
void Component::draw(sf::RenderWindow * window) {
window->draw(buttonEnter.retSprite());
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
Button.hpp
#ifndef BUTTON_HPP
#define BUTTON_HPP
#include "ManagerGroup.hpp"
class Button {
public:
Button();
~Button();
void create(std::string id, int x, int y, sf::Texture * texture1);
sf::Sprite retSprite();
bool eventMouse(int x, int y);
private:
sf::Sprite m_spriteButton;
sf::Sprite m_spriteButton2;
std::string m_idButton;
};
#endif //BUTTON_HPP
/////////////////////////////////////////////////////////////////////////////////////////////////////
WinConfig.hpp
#ifndef WIN_CONFIG_HPP
#define WIN_CONFIG_HPP
#include <SFML/Graphics.hpp>
#include "Component.hpp"
class WinConfig : public Component {
public:
WinConfig(Component * component);
~WinConfig();
void create();
void whileGame();
private:
sf::RenderWindow m_window;
Component * m_component;
};
#endif //WIN_CONFIG_HPP
//////////////////////////////////////////////////////////////////////////////////////////////////////////µ
#ifndef COMPONENT_HPP
#define COMPONENT_HPP
#include "ComponentGroup.hpp"
#include "ManagerGroup.hpp"
class Component : public ComponentGroup {
public:
Component();
~Component();
void create(ManagerGroup * ptr_managerGroup);
void draw(sf::RenderWindow * window);
protected:
Button buttonEnter;
};
#endif //COMPONENT_HPP
/////////////////////////////////////////////////////////////////////////////////////////////
-
Désolé je vois rien de spécial, peut-être que je loupe un truc évident j'en sais rien. :/
Tu peux vérifier dans eventMouse que Point et BoundingBox contiennent bien ce qu'elles sont censées contenir
-
Ha :/, pas de soucis.
Bah j'ai modifié le code pour faire des affichages :
WinConfig.cpp
case sf::Event::MouseButtonPressed:
std::cout << "MouseButtonPressed !" << std::endl;
if(buttonEnter.eventMouse(m_window.mapPixelToCoords(
{event.mouseButton.x, event.mouseButton.y})))
{
std::cout << "Test" << std::endl;
}
break;
Button.cpp
bool Button::eventMouse(sf::Vector2f const &cursor_position)
{
std::cout << "eventMouse" << std::endl;
bool test = m_spriteButton.getGlobalBounds().contains(
cursor_position.x,cursor_position.y);
std::cout << test << std::endl;
return test;
}
-
Au pire si tes bouton sont carrés tu test le clique de cette façon:
if(XMouse>XBouton&&XMouse<XBouton+XTailleBouton&&YMouse>YBouton&&YMouse<YBouton+YTailleBouton)
Et SFML a beau redimensionner l'affichage en même que la fenêtre,il ne fait pas pareil avec les coordonnés,c'est peut être aussi ça.