Bonsoir,
Je débute sur SFML avec le C++ (auparavant, j'utilisais SDL avec le langage C). J'ai migré vers SFML pour mieux structurer mes projets en gérant les Game States.
Cependant, j'ai du mal à passer du menu principal au jeu, c'est à dire à changer d'état.
Je vous joins les trois fichiers concernés, le dernier est celui du menu, où j'aimerais changer d'état.
Voici la structure du programme :
- main.cpp
- gameengine.cpp
- menu.cpp
- game.cpp
- gameengine.h
- menu.h
- game.h
- constantes.h
- gamestate.h
Fichier Main.cpp :int main()
{
GameEngine engine;
engine.Init("Space Exploration", SCREEN_WIDTH, SCREEN_HEIGHT);
//On instancie le menu principal
engine.ChangeState(Menu::Instance());
//Boucle principale
while (engine.Running())
{
engine.HandleEvents();
engine.Update();
engine.Draw();
}
//On nettoie l'engine
engine.Cleanup();
return 0;
}
Les fonctions de GameEngine.cpp :void GameEngine::Init(const char* titre, int largeur, int hauteur)
{
m_running = true;
m_window = new sf::RenderWindow(sf::VideoMode(largeur, hauteur), titre);
}
void GameEngine::Cleanup()
{
delete m_window;
}
void GameEngine::ChangeState(GameState* state)
{
if(!states.empty())
{
states.back()->Cleanup();
states.pop_back();
}
states.push_back(state);
states.back()->Init();
}
void GameEngine::PushState(GameState* state)
{
if(!states.empty())
{
states.back()->Pause();
}
states.push_back(state);
states.back()->Init();
}
void GameEngine::PopState()
{
if(!states.empty())
{
states.back()->Cleanup();
states.pop_back();
}
if(!states.empty())
{
states.back()->Resume();
}
}
Fichier Menu.cpp :Menu Menu::m_Menu;
void Menu::Init() {}
void Menu::Cleanup()
{}
void Menu::Pause()
{}
void Menu::Resume()
{}
void Menu::HandleEvents(GameEngine* m_engine)
{
//On inspecte tous les évènements de la fenêtre qui ont été émis depuis la précédente itération
sf::Event event;
while(m_engine->getWindow()->pollEvent(event))
{
if(event.type == sf::Keyboard::isKeyPressed(sf::Keyboard::Return)) {
//Je souhaite changer d'état ici
}
//Pour pouvoir fermer la fenêtre
if(event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
m_engine->getWindow()->close();
m_engine->Quit();
}
}
}
void Menu::Update(GameEngine* m_engine)
{}
void Menu::Draw(GameEngine* m_engine)
{
m_engine->getWindow()->clear(sf::Color::Black);
sf::Vector2i mouse = sf::Mouse::getPosition();
//charger bg
sf::Texture menu_bg;
if (!menu_bg.loadFromFile("ressources/menu_bg.jpg")){}
//charger font
sf::Font font;
if (!font.loadFromFile("ressources/nulshock_bd.ttf")){}
//draw
//background
sf::Sprite background;
background.setTexture(menu_bg);
background.setPosition(0, 0);
m_engine->getWindow()->draw(background);
//boutons
//GAME
sf::Text game;
game.setFont(font);
game.setString("GAME");
game.setCharacterSize(50);
game.setColor(sf::Color::White);
sf::FloatRect gameRect = game.getLocalBounds();
game.setOrigin(gameRect.left + gameRect.width/2.0f,
gameRect.top + gameRect.height/2.0f);
game.setPosition(sf::Vector2f(SCREEN_WIDTH/2.0f,SCREEN_HEIGHT/2.0f-200));
m_engine->getWindow()->draw(game);
//OPTIONS
sf::Text options;
options.setFont(font);
options.setString("OPTIONS");
options.setCharacterSize(50);
options.setColor(sf::Color::White);
sf::FloatRect optionsRect = options.getLocalBounds();
options.setOrigin(optionsRect.left + optionsRect.width/2.0f,
optionsRect.top + optionsRect.height/2.0f);
options.setPosition(sf::Vector2f(SCREEN_WIDTH/2.0f,SCREEN_HEIGHT/2.0f));
m_engine->getWindow()->draw(options);
//EXIT
sf::Text exit;
exit.setFont(font);
exit.setString("EXIT");
exit.setCharacterSize(50);
exit.setColor(sf::Color::White);
sf::FloatRect exitRect = exit.getLocalBounds();
exit.setOrigin(exitRect.left + exitRect.width/2.0f,
exitRect.top + exitRect.height/2.0f);
exit.setPosition(sf::Vector2f(SCREEN_WIDTH/2.0f,SCREEN_HEIGHT/2.0f+200));
m_engine->getWindow()->draw(exit);
m_engine->getWindow()->display();
}
Merci beaucoup d'avance !
Bonne soirée.