Bonjour...
J'apprends le c++ et je suis assez nouveau avec la sfml...
Ça fais un moment que je cherche partout et que je retourne mon code dans tout les sens... je ne comprends pas ce que je fais de faut...
En résumé je voulais créer une fenêtre "console" a partir de laquelle j'affiche une ou plusieurs autre fenêtre(s)...
Une class pour ma première fenêtre dans un autre fichier, une classe pour la deuxième et la gestion des événements dans le main...
les shapes que j'essaie d'afficher n'apparaissent qu'une fois sur 2 (parfois des suite de 10 fois avec, et dix fois sans...).
C'est un problème avec l'ouverture de la fenêtre je pense, car quand le programme tourne, si on ouvre et ferme plusieurs fois cette deuxième fenêtre, les forme apparaissent ou non...
Ce n'est apparemment pas un problème avec mes shapes puisqu'ils s'affichent normalement sur la première fenêtre...
Voici l'exemple... (J'ai essayé de simplifier le code pour l'essentiel, mais en gardant la même structure que mon code de base)...
Ah, j'oublie de préciser que je travaille avec Xcode sous macos...
main
#include <iostream>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
#include "DeuxiemeFenetre.hpp"
#include "PremiereFenetre.hpp"
int main(int, char const**){
//Ouvre une/la console...
PremiereFenetre premiereFenetre;
DeuxiemeFenetre deuxiemeFenetre ;
sf::CircleShape petitRond;
//Entre dans la boucle principale, la premièrefenêtre étant la fenêtre qui ouvre et ferme le les autres fenêtre
while(premiereFenetre.fenetreConsole.isOpen()){
//affiche le message de la console
if(premiereFenetre.paroleUtilisateur == 0){
premiereFenetre.poserUneQuestion();
}
//Boucle des événements de la console
sf::Event evenement;
while (premiereFenetre.fenetreConsole.pollEvent(evenement)){
// évènement "fermeture demandée" : on ferme la fenêtre si "escape" ou la croix est cliquée
if ((evenement.type == sf::Event::KeyPressed &&
evenement.key.code == sf::Keyboard::Escape) ||
evenement.type == sf::Event::Closed){
premiereFenetre.fenetreConsole.close();
//... et les autres fenêtres...
}
if (evenement.type == sf::Event::TextEntered && premiereFenetre.paroleUtilisateur == 1 && evenement.text.unicode < 256){
premiereFenetre.tourDeConsole(evenement);
}else if (evenement.type == sf::Event::Resized){
sf::Vector2u tailleFenetre = premiereFenetre.fenetreConsole.getSize();
sf::Vector2f centre(tailleFenetre.x/2, tailleFenetre.y/2);
sf::Vector2f taille(tailleFenetre.x, tailleFenetre.y);
sf::View nouvelleVue(centre, taille);
premiereFenetre.fenetreConsole.setView(nouvelleVue);
}
if(premiereFenetre.emplacement == 50){
if(deuxiemeFenetre.RenderWindow.isOpen() == 0){
deuxiemeFenetre.RenderWindow.create(sf::VideoMode( 2000 , 2000 ), "deuxiemeFenetre");
sf::Vector2u tailleJardin;
sf::Vector2i positionConsole, positionJardin;
int posX, posY;
positionConsole = premiereFenetre.fenetreConsole.getPosition();
tailleJardin = deuxiemeFenetre.RenderWindow.getSize();
posY = positionConsole.y;
posX = positionConsole.x - tailleJardin.x;
if (posX < 2000){
posX = 2000;
positionConsole.x = posX;
premiereFenetre.fenetreConsole.setPosition(positionConsole);
}
posX = posX - tailleJardin.x;
positionJardin.x = posX;
positionJardin.y = posY;
deuxiemeFenetre.RenderWindow.setPosition(positionJardin);
premiereFenetre.fenetreConsole.requestFocus();
petitRond.setScale(1, 1);
petitRond.setOrigin(1, 1);
petitRond.setRadius(250);
petitRond.setPointCount(4);
sf::Color rondCouleur(sf::Color(255,255,0));
petitRond.setFillColor(rondCouleur);
petitRond.setPosition(1000, 1000);
}
}else{
if(deuxiemeFenetre.RenderWindow.isOpen()){
deuxiemeFenetre.RenderWindow.close();
}
}
}
if(deuxiemeFenetre.RenderWindow.isOpen()){
while(deuxiemeFenetre.RenderWindow.pollEvent(evenement)){
// évènement "fermeture demandée" : on ferme la fenêtre si "escape" ou la croix est cliquée
if ((evenement.type == sf::Event::KeyPressed &&
evenement.key.code == sf::Keyboard::Escape) ||
evenement.type == sf::Event::Closed){
deuxiemeFenetre.RenderWindow.close();
}
}
deuxiemeFenetre.RenderWindow.clear(sf::Color::Black);
deuxiemeFenetre.RenderWindow.draw(deuxiemeFenetre.grosRond);
deuxiemeFenetre.RenderWindow.draw(petitRond);
deuxiemeFenetre.RenderWindow.draw(deuxiemeFenetre.petitRectangle);
deuxiemeFenetre.RenderWindow.display();
}
premiereFenetre.fenetreConsole.clear(sf::Color(10,35,10));
premiereFenetre.fenetreConsole.draw(deuxiemeFenetre.petitRectangle);
premiereFenetre.fenetreConsole.draw(deuxiemeFenetre.grosRond);
premiereFenetre.fenetreConsole.draw(petitRond);
premiereFenetre.fenetreConsole.draw(premiereFenetre.texteConsoleAAfficher);
premiereFenetre.fenetreConsole.display();
}
return EXIT_SUCCESS;
}
PremiereFenetre.cpp
//#include <string>
//#include <sstream>
#include <fstream>
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <pwd.h>
#include <sstream>
//#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics.hpp>
#include "ResourcePath.hpp"
//#include "EntreeSortieFichier.hpp"
#include "PremiereFenetre.hpp"
void PremiereFenetre::poserUneQuestion( std::string &question){
...
}
void PremiereFenetre::poserUneQuestion(){
...
}
void PremiereFenetre::ajoutDansConsole(){
...
}
void PremiereFenetre::navigation(){
...
}
void PremiereFenetre::tourDeConsole(sf::Event &evenement){
//Si la touche pressée est entrée
if (evenement.text.unicode == 10){
paroleUtilisateur = 0;
emplacement = 50;
texteTotalSTD += "Blah !\n";
ajoutDansConsole() ;
//Si la touche pressée est retour
}else if (evenement.text.unicode == 8){
emplacement = 0;
ajoutDansConsole();
}else {
ligneCourrante += evenement.text.unicode;
ajoutDansConsole();
}
}
void PremiereFenetre::initialisationVariables(){
...
}
PremiereFenetre::PremiereFenetre(){
fenetreConsole.create(sf::VideoMode(1000,2000), L"Premiere Fenetre");
std::string cheminPolice = ressourceMTKConsole + "LiberationMono-Regular.ttf";
if (!police.loadFromFile(cheminPolice)){
sortieErreur << "\tImpossible de trouver la police demandée : " << ressourceMTKConsole << "LiberationMono-Regular.ttf\n";
}
texteConsoleAAfficher.setString(texteTotalSTD);
texteConsoleAAfficher.setFont(police);
texteConsoleAAfficher.setFillColor(sf::Color(255,200,200));
initialisationVariables();
}
DeuxiemeFenetre.cpp
#include <iostream>
#include <SFML/Graphics.hpp>
#include "DeuxiemeFenetre.hpp"
void DeuxiemeFenetre::nouvelleFenetreJardin(){
RenderWindow.create(sf::VideoMode(2000,2000), L"jadin");
}
DeuxiemeFenetre::DeuxiemeFenetre(){
grosRond.setScale(1, 1);
grosRond.setOrigin(1, 1);
grosRond.setRadius(500);
grosRond.setPointCount(4);
sf::Color rondCouleur(sf::Color(255,255,0));
grosRond.setFillColor(rondCouleur);
grosRond.setPosition(10, 10);
petitRectangle.setSize(sf::Vector2f(200,200));
petitRectangle.setFillColor(rondCouleur);
petitRectangle.setPosition(100, 100);
}
Bon voilà...
Sinon une solution est évidement de tout faire dans la même fenêtre en poussant par exemple la console sur la droite... Ce ne serait pas un problème... mais bon, ça m'embête car là il y a manifestement quelque chose que je n'ai pas compris... et j'aimerai savoir quoi... en outre la possibilité d'avoir une fenêtre avec seulement des textes et une autre avec les animations me semble assez "pratique"...
Voilà...
Et merci aux développeurs de la sfml et à vos docus/tutos etc...
P.S. : sinon, j'utilise la dernière version de la sfml (retéléchargée hier)
P.S. : j'utilise la dernière version (je l'ai retéléchargé hier