Bonjour,
Je me trouve confronté à un problème assez important. J'ai une classe "Button" que j'utilise pour créer des boutons à partir de RectangleShape que j'utilise depuis SFML 2.0, je suis pas récemment sur SFML 2.3 et depuis ma classe (dont je n'ai rien changé) me sort des bad_alloc de temps à autres.
J'ai essayé de voir d'où venait ces bad_alloc avec le debbuger mais je n'ai rien trouvé.
Des fois tout fonctionne correctement et d'autres fois impossible de lancer le programme sans avoir ce bad_alloc.
Et je suis persuadé que l'erreur vient de cette classe car si je ne l'appelle pas dans mon main tout se passe bien.
Voici ma classe Button :
#include "Button.h"
Button::Button()
{
if (!font.loadFromFile("Resources/Hyperspace.ttf"))
{
std::cout << "erreur font" << std::endl;
}
button_text.setFont(font);
}
Button::~Button()
{
}
Button::Button(int width, int height, int posX, int posY, int r, int g, int b, bool shadow, std::string text)
{
if (!font.loadFromFile("Resources/Hyperspace.ttf"))
{
std::cout << "erreur font" << std::endl;
}
button_text.setFont(font);
button.setSize(sf::Vector2f(width, height));
button.setPosition(posX, posY);
button.setFillColor(sf::Color(r,g,b));
button_GB = button.getGlobalBounds();
button_text.setCharacterSize(100);
button_text.setString(text);
button_text.setColor(sf::Color::White);
text_GB = button_text.getGlobalBounds();
button_text.setPosition(posX + ((width - text_GB.width)/ 2) , posY + ((height - text_GB.height)/ 2 - (text_GB.height / 2)));
if (shadow == true)
{
button_shadow.setSize(sf::Vector2f(width, height));
button_shadow.setPosition(posX + 2, posY + 2);
button_shadow.setFillColor(sf::Color(r,g,b-80));
}
}
void Button::setSize(int width, int height)
{
m_width = width;
m_height = height;
button.setSize(sf::Vector2f(width, height));
button_GB = button.getGlobalBounds();
}
void Button::setPosition(int posX, int posY)
{
m_posX = posX;
m_posY = posY;
button.setPosition(posX, posY);
button_GB = button.getGlobalBounds();
}
void Button::setColor(int red, int green, int blue)
{
m_red = red;
m_green = green;
m_blue = blue;
button.setFillColor(sf::Color(red,green,blue));
}
void Button::setText(string text)
{
m_text = text;
button_text.setCharacterSize(20);
button_text.setString(text);
button_text.setColor(sf::Color::White);
text_GB = button_text.getGlobalBounds();
button_text.setPosition(m_posX + ((m_width - text_GB.width)/ 2) , m_posY + ((m_height - text_GB.height)/ 2 - (text_GB.height / 2)));
}
void Button::setShadow(bool activate)
{
if (activate == true)
{
button_shadow.setSize(sf::Vector2f(m_width, m_height));
button_shadow.setPosition(m_posX + 2, m_posY + 2);
button_shadow.setFillColor(sf::Color(m_red, m_green, m_blue-80));
}
}
void Button::setSprite(string filepath)
{
if (!button_spr_texture.loadFromFile(filepath))
{
std::cout << "erreur texture button" << std::endl;
}
button.setTexture(&button_spr_texture);
}
bool Button::isClicked(sf::Event *event, sf::Vector2f *worldPos)
{
if((event->type == sf::Event::MouseButtonPressed) && (event->mouseButton.button == sf::Mouse::Left) && (button_GB.contains(worldPos->x, worldPos->y)))
{
return true;
}
else
{
return false;
}
}
int Button::getWidth()
{
return m_width;
}
int Button::getHeight()
{
return m_height;
}
Le header :
#ifndef BUTTON_H
#define BUTTON_H
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace std;
class Button : public sf::Drawable
{
public:
Button(int width, int height, int posX, int posY, int r, int g, int b, bool shadow, std::string text);
Button();
~Button();
void setSize(int width, int height);
void setPosition(int posX, int posY);
void setColor(int red, int green, int blue);
void setText(string text);
void setShadow(bool activate);
void setSprite(string filepath);
int getWidth();
int getHeight();
bool isClicked(sf::Event *event, sf::Vector2f *worldPos);
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
target.draw(button_shadow, states);
target.draw(button, states);
target.draw(button_text, states);
}
int m_width = 0;
int m_height = 0;
int m_posX = 0;
int m_posY = 0;
int m_red = 0;
int m_green = 0;
int m_blue = 0;
string m_text = "";
bool m_activate = false;
sf::RectangleShape button;
sf::RectangleShape button_shadow;
sf::Text button_text;
sf::FloatRect text_GB;
sf::FloatRect button_GB;
sf::Font font;
sf::Texture button_spr_texture;
};
#endif // BUTTON_H
Et pour appeler cette classe je fais tout simplement Button Button1; Et ensuite j'appelle les fonctions si besoin.
Et là je ne vois pas d'où peut venir le problème.
Merci d'avance.