Bonjours,
voila je poste ici pour dire que un sf::Image n'arrive pas à se détruire lorsque l'un de ses pixels soit transparent avec une image derrière. Je m'explique : Je déplace ma Windows comme ceci :
guiml::Window window(sf::VideoMode(800, 600), std::string("teste"), NULL, 60, sf::Color::Black, guiml::Image(NULL, std::string("background.jpg")));
Je pense qu'il y a pas besoin de commenter mais je le fait : je créer une Windows de taille 800,600, de titre "teste" qui n'a pas de parent, avec un framerate de 60, une couleur noir pour le clean et une image en fond d'écran qui est background.jpg.
Mais la je rencontre un tout petit (gros ?) problème. Si déclare un sf::Sprite et que je souhaite que l'un de ses pixels soit transparent, je rencontre (grâce à gdb) l'erreur suivante :
(gdb) where
#0 0x00007ffff678e2c5 in _int_free () from /lib/libc.so.6
#1 0x00007ffff7bbcee0 in __gnu_cxx::new_allocator<unsigned char>::deallocate(unsigned char*, unsigned long) () from ../../lib/libGUIML.so
#2 0x00007ffff7bbce8e in std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_deallocate(unsigned char*, unsigned long) () from ../../lib/libGUIML.so
#3 0x00007ffff7bbcddb in std::_Vector_base<unsigned char, std::allocator<unsigned char> >::~_Vector_base() () from ../../lib/libGUIML.so
#4 0x00007ffff7bbcd1d in std::vector<unsigned char, std::allocator<unsigned char> >::~vector() () from ../../lib/libGUIML.so
#5 0x00007ffff7bbcc3e in sf::Image::~Image() () from ../../lib/libGUIML.so
#6 0x00007ffff7bbb347 in guiml::Image::roundEdge(int) () from ../../lib/libGUIML.so
#7 0x000000000040119d in main ()
Je pense que la fonction roundEdge vous sera utile, d'ailleurs la voici :
void Image::roundEdge(int size)
{
if(m_sprite.getTexture())
{
sf::Image image = m_sprite.getTexture()->copyToImage();
for(int i = 0; i != size; i++)
{
sf::Vector2f topleft = circle(i, size, size, size);
sf::Vector2f bottomleft = circle(i, size, m_sprite.getTexture()->getSize().y - size, size);
sf::Vector2f topright = circle(i + m_sprite.getTexture()->getSize().x - size, m_sprite.getTexture()->getSize().x - size, size, size);
sf::Vector2f bottomright = circle(i + m_sprite.getTexture()->getSize().x - size, m_sprite.getTexture()->getSize().x - size, m_sprite.getTexture()->getSize().y - size, size);
for(int j = 0; j < topleft.y; j++)
{
sf::Color pixel = image.getPixel(i, j);
pixel.a = 0;
image.setPixel(i, j, pixel);
}
for(int j = m_sprite.getTexture()->getSize().y; j > bottomleft.x; j--)
{
sf::Color pixel = image.getPixel(i, j);
pixel.a = 0;
image.setPixel(i, j, pixel);
}
for(int j = 0; j < topright.y; j++)
{
sf::Color pixel = image.getPixel(i + m_sprite.getTexture()->getSize().x - size, j);
pixel.a = 0;
image.setPixel(i + m_sprite.getTexture()->getSize().x - size, j, pixel);
}
for(int j = m_sprite.getTexture()->getSize().y ; j > bottomright.x; j--)
{
sf::Color pixel = image.getPixel(i + m_sprite.getTexture()->getSize().x - size, j);
pixel.a = 0;
image.setPixel(i + m_sprite.getTexture()->getSize().x - size, j, pixel);
}
}
setImage(image);
}
}
et voici la fonction circle :
sf::Vector2f circle(const float x, const float centerx, const float centery, const float size)
{
float y1 = (2*centery + sqrt(4*(-(x-centerx)*(x-centerx)+size*size)))/2;
float y2 = (2*centery - sqrt(4*(-(x-centerx)*(x-centerx)+size*size)))/2;
return sf::Vector2f(y1, y2);
}
Je pense que le tout est assez clair
. Je vous remercie beaucoup
. Si vous ne comprenez pas un bout de code (ce qui risque d'arriver), n'hésitez pas
.