Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML - Création d'une nouvelle fenêtre

18 novembre 2019 à 22:02:08

Bonjour à tous.

C'est sans doute une question un peu bête que je m'apprête à poser mais la voici :

Pour la fin du semestre on doit adapter un jeu du commerce ( squadro pour ceux qui veulent voir) en c++. N'ayant aucune expérience dans le jeu en c++ j'ai choisi SFML pour l'interface (est-ce que c'est bien ? ). J'ai réussi à créer le menu de mon jeu dont voici le code :

#include <iostream>
#include <SFML/Graphics.hpp>
#include "Button.h"
#include "game.h"

using namespace std;

int main() {
	sf::RenderWindow window;
	sf::Color Color;

	sf::Vector2i centerWindow((sf::VideoMode::getDesktopMode().width / 2) - 445, (sf::VideoMode::getDesktopMode().height / 2) - 480);

	window.create(sf::VideoMode(900, 900), "SFML Textbox", sf::Style::Titlebar | sf::Style::Close);
	window.setPosition(centerWindow);

	window.setKeyRepeatEnabled(true);

	sf::Font font;
	if (!font.loadFromFile("font.ttf"))
		std::cout << "Font not found!\n";

    //Création de l'image
    sf::Texture texture[1];
    texture[0].loadFromFile("logo.jpg");
    sf::RectangleShape rectangle;
    sf::Sprite sprite[1];
    rectangle.setSize(sf::Vector2f(750,182));
    sprite[0].setTexture(texture[0]);
    sprite[0].setPosition(100,50);

    //Création du texte
    sf::Text text;
    text.setFont(font);
    text.setCharacterSize(20);
    text.setColor(sf::Color(200,0,0));
    text.setStyle(sf::Text::Bold);
    text.setPosition(300,850);


    //Création du bouton
	Button btn1("Jouer", { 200, 100 }, 30, sf::Color::Green, sf::Color::White);
	btn1.setFont(font);
	btn1.setPosition({ 350, 300 });


	//Main Loop:
	while (window.isOpen()) {

		sf::Event Event;

		//Event Loop:
		while (window.pollEvent(Event)) {
			switch (Event.type) {

			case sf::Event::Closed:
				window.close();
			case sf::Event::MouseMoved:
				if (btn1.isMouseOver(window)) {
					btn1.setBackColor(sf::Color(200,0,0));
				}
				else {
					btn1.setBackColor(sf::Color(6,164,154));
				}
				break;
			case sf::Event::MouseButtonPressed:
				if (btn1.isMouseOver(window)) {
                    Squadro squadro;
					window.close();
				}
			}
		}
		window.clear(sf::Color::White);
		btn1.drawTo(window);
		window.draw(rectangle);
		window.draw(sprite[0]);
		window.draw(text);
		window.display();
	}
}

Et quand je clique sur mon bouton, il ferme la fenêtre mais la classe Squadro ne se lance pas... voici le code de "game.h" :

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;


class Squadro{

private:

public:

    void Test();
    void MainFunctions();

};


void Squadro::Test()
{

    cout << "okkkkkkkkkkkkkkkkkkkk" << endl;


}


void Squadro::MainFunctions()
{

    sf::Window window(sf::VideoMode(800, 600), "My window");

    // run the program as long as the window is open
    while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }
    }



}



#endif // GAME_H_INCLUDED

Bref, je suis quasi sûr que mon erreur est vraiment naïve mais bon..

Merci d'avoir lu et merci d'avance pour vos réponses !


-
Edité par Dasher32 5 janvier 2021 à 13:07:20

  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2019 à 17:39:09

J'essais d'arranger le problème de mon coté mais je pense qu'il s'agit u fait que l'instance de t'as fenêtre se fait dans une fonction de "game.h", et que par conséquent à la fin de la fonction celle-ci meurt et disparait, bref je vais essayer le code et voir cec que je peux te donner en retour ^^
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2019 à 18:38:29

tu declare bien ton objet squadro squadro donc le constructeur est appelé.

donc tu dois bien avoir la sortie okkkkkk sur la console, mais derriere tu fais un window.close donc tu sors du main

ton squadro::mainfunctiions() n'est jamais lancé

donc dans le main

squadro squadro;
squadro.mainfunction();
window.close();


-
Edité par Djarkan 30 novembre 2019 à 18:42:19

  • Partager sur Facebook
  • Partager sur Twitter