Witam.

Otóż mam pewien problem z wyświetlaniem sprite'ów w bibliotece sfml.

Tworzę sobie właśnie menu, mam w tym celu 2 klasy:

cMenu - klasa od menu
cButton - klasa od przycisków

Nie są one jak na razie zbyt rozwinięte, bo to dopiero początek.

W klasie cMenu mam metodę AddButton:

 void cMenu::AddButton( short x, short y, Mode dest, const std::string &adres)
{


	if ( dest == GameMode )
	{
		tab.push_back(cButton());
        tab.back().SetButton( x, y, dest, adres);
	
	}
}

Oto funkcja SetButton:

void cButton::SetButton( short x, short y, Mode dest, const std::string &adres )
{

	i_gfx.LoadFromFile( adres );
	gfx.SetImage(i_gfx);
	gfx.SetPosition( x, y);
	 
    ButtonDest = dest;

}

Problem jest taki, iż gdy dodaję za pomocą AddButton np. 4 przyciski, poprawnie wyświetla się tylko ten dodany na końcu, reszta ma wymiary poprawne, lecz jest to puste, białe pole. Gdy próbowałem użyć w AddButton konstruktora z argumentami, który działał tak jak funkcja SetButton, wszystkie wtedy były pustymi polami.

Gdy przycisk jest dodawany standardowo, z konstruktora klasy cButton nie ma z nim żadnych problemów, ale gdy chcę dodać z poziomu klasy cMenu, wtedy pojawiają się problemy.

Teraz trochę kombinowałem i zauważyłem jedną rzecz.

Na początku dodaję tylko jeden przycisk(za pomocą AddButton). Oczywiście działa bardzo dobrze. Po wciśnięciu na ten przycisk sprawiłem, że inicjuję drugi.

Wynik: O ile na początku przycisk wyświetlał się normalnie, to po pojawieniu się nowego przycisku ten pierwszy zamienił się w puste pole.

Doszedłem do wniosku, iż błąd leży właśnie w metodzie AddButton, ale nie wiem co takiego robię źle.

Oto pełny kod:

//menu.h

#ifndef _MENU_H
#define _MENU_H

#include <iostream>
#include <SFML\Graphics.hpp>

extern sf::RenderWindow App;
extern sf::Event Event;
extern const sf::Input & Input;



enum Mode { M_MENU, M_GAME, M_SETTINGS, M_INFO };
enum Buttons{ B_MENU, B_GAME, B_SETTINGS, B_INFO };




class cButton
{
    //private

	short x, y;
	sf::Image i_gfx;
	sf::Sprite gfx;
	Mode ButtonDest;



public:

	cButton();
	cButton( short x, short y, Mode dest, const std::string &adres );
	
	void SetButton(short x, short y, Mode dest, const std::string &adres);
	void DrawButton();
	bool IsButtonPressed();
};







class cMenu
{
	
	short tx, ty;
	Mode tdest;
	std::string tadres;

public:
    
	std::vector <cButton> tab;// na czas testów jest publiczny, później będzie prywatny
	void AddButton( short x, short y, Mode dest, const std::string &adres);
	void DrawMenu();
	
	
	cMenu();
	

};




#endif






//menu.cpp

#include "menu.h"

extern Mode GameMode;


cButton::cButton()
{
	x;
	y;
	i_gfx;
	gfx;
	ButtonDest;
}

cButton::cButton( short x, short y, Mode dest, const std::string &adres )
{
  
	//if (dest == GameMode)
	//{
	i_gfx.LoadFromFile( adres );
	gfx.SetImage(i_gfx);
	gfx.SetPosition( x, y);
	//}	 

	ButtonDest = dest;


}

void cButton::DrawButton()
{
	
	if( ButtonDest == GameMode ) App.Draw(gfx);
	
}

bool cButton::IsButtonPressed()
{
	if( Input.IsMouseButtonDown( sf::Mouse::Left) )
	{
		sf::Vector2f point = gfx.TransformToLocal( sf::Vector2f(( float ) Input.GetMouseX(),( float ) Input.GetMouseY() ) );
        if( point.x >= 0 && point.y >= 0 && point.x <= i_gfx.GetWidth() && point.y <= i_gfx.GetHeight() )
	   {
		 
			return true;
		
		}
        
	}

}

void cButton::SetButton( short x, short y, Mode dest, const std::string &adres )
{

	i_gfx.LoadFromFile( adres );
	gfx.SetImage(i_gfx);
	gfx.SetPosition( x, y);
	 
    ButtonDest = dest;

}

cMenu::cMenu()
{

	std::vector <cButton> tab;
	

}


void cMenu::AddButton( short x, short y, Mode dest, const std::string &adres)
{


	if ( dest == GameMode )
	{
		tab.push_back(cButton());
        tab.back().SetButton( x, y, dest, adres);
	
	}
}



void cMenu::DrawMenu()
{

	
       std::vector <cButton>::iterator it;
       for( it=tab.begin(); it!=tab.end(); ++it )
        {
			it->DrawButton();
       }                         
	

}









///////////////////////////////////
//                               //
//           Project :)          //
//                               // 
//                               //
//         By blojayble          //
//                               //
//           main.cpp            //
//                               //
///////////////////////////////////

#include <SFML\Graphics.hpp>
#include "menu.h"

sf::RenderWindow App(sf::VideoMode(960, 800, 32), "Junk Warz", sf::Style::Close);
sf::Event Event;
const sf::Input & Input = App.GetInput();
Mode GameMode = M_MENU;







void main()
{
	
	App.SetFramerateLimit(60);
	

	
	cMenu(Menu);
	cButton(Button);

	Menu.AddButton(350, 100, M_MENU , "Resources/Menu/gfxGame.PNG" );
	//Menu.AddButton(350, 400, M_MENU , "Resources/Menu/gfxSettings.PNG" );
    //Menu.AddButton(350, 550, M_MENU , "Resources/Menu/gfxInfo.PNG" );
	//Menu.AddButton(350, 700, M_MENU , "Resources/Menu/gfxExit.PNG" );


	while(App.IsOpened() )
	{
	App.Clear(sf::Color(255, 255, 2));
	
		
	while(App.GetEvent(Event))	
		{
			if (Event.Type == sf::Event::Closed) App.Close();
			
			if ( Menu.tab[0].IsButtonPressed()  == true) 
			{
			
			Menu.AddButton(350, 700, M_MENU , "Resources/Menu/gfxExit.PNG" );
			
			}
		}
	
	
	
	
	
	
	
	
	

	
	Menu.DrawMenu();

	App.Display();
	   
    }
}



 

Być może napisałem to wszystko chaotycznie, ale jestem już nieco zmęczony.

Z góry dziękuję za wszelką pomoc.

Pozdrawiam.