Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU] - Affichage de variables  (Lu 8789 fois)

0 Membres et 1 Invité sur ce sujet

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
[RESOLU] - Affichage de variables
« le: Septembre 05, 2014, 06:05:26 pm »
Bonjour,

  J'ai débuté l'apprentissage du langage C++ il n'y a pas très longtemps. Mon but est d'effectuer de petites simulations avec SFML 1.6.

  J'ai réussi a réaliser une partie du programme que je veux faire en lisant la documentation ici. Je suis maintenant confronté à une plus grande difficulté. Je n'ai pas vu d'exemple de ce genre.

  Je voudrais savoir comment afficher, en temps réel, la valeur des différentes variables (t, y, v et a) dans la fenêtre supérieure gauche. Par exemple, comment afficher le temps au dixième de seconde près et l'altitude correspondante avec une décimale?

 Merci

#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <SFML/Audio.hpp>
#include <SFML/Window.hpp>
#include <SFML/Window/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Glyph.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/System/Resource.hpp>
#include <SFML/System/Vector2.hpp>
#include <SFML/System/Unicode.hpp>

using namespace std;

int main()
{

// Paramètres de la fenêtre principale.

   int XM=240;    // Largeur en pixels selon x de la fenêtre de données.
   int YM=480;    // Hauteur en pixels selon y de la fenêtre de données.

// Paramètres physiques.

   const int MF=3000000;      // Masse totale de la fusée [kg].
   const int DMAS=13500;      // Débit massique [kg/s].
   const int VEJECT=2500;     // Vitesse d'éjection des gaz [m/s].
   double MT;                 // Masse de la Terre [kg].
   MT=5.98*pow(10,24);
   const long RT=6378000;     // Rayon de la Terre [m].
   double G;
   G=6.67*pow(10,-11);        // Constante de gravitation universelle [m^3/s^2*kg].

// Compteurs.

   int i=0;                   // Compteur.
   int n;                     // Numéro de l'élément échantillonné.
   int N=10000;               // Nombre d'éléments dans les tableaux.

// Variables physiques.

   double temps;              // Temps actuel [s].
   double t[N];               // Tableau des temps [s].
   double delta_t[N];         // Tableau des différences de temps [s].
   double y[N];               // Altitude de la fusée [m].
   double v[N];               // Vitesse de la fusée [m/s].
   double a[N];               // Accélération de la fusée [m/s^2].

// Ouverture du fichier saturn.txt.

   ofstream outputFile;
   outputFile.open("saturn.txt");

// Création de la fenêtre.

   sf::RenderWindow App(sf::VideoMode(800, 600), "Lancement d'une fusee");
   sf::Font Arial;
   if (!Arial.LoadFromFile("arial.ttf"))
   return EXIT_FAILURE;

   sf::Shape Rect1 = sf::Shape::Rectangle(0, 0, XM, YM, sf::Color(25, 65, 30));
   sf::Shape Rect2 = sf::Shape::Rectangle(XM, 0, 800, YM, sf::Color(20, 25, 200));
   sf::Shape Rect3 = sf::Shape::Rectangle(0, YM, 800, 600, sf::Color(91, 24, 24));

// Initialisation des variables.

   sf::Clock Clock;
   n = 0;
   t[0] = 0;
   delta_t[0] = 0;
   y[0] = 0;
   v[0] = 0;
   a[0] = (DMAS*VEJECT)/(MF-DMAS*t[0])-((G*MT)/pow((RT+y[0]),2));

// Écriture du titre et des premières données dans le fichier saturn.txt.

   outputFile << "t[n]     y[n]     v[n]      a[n]"<< endl << endl;
   outputFile << std::fixed << setprecision (2) << t[0]<<"    "<< y[0]<<"    "<< v[0]<<"    "<<a[0] << endl;

// Début de la simulation.

   while (App.IsOpened())
   {
    sf::Event Event;
    while (App.GetEvent(Event))
    {
     if (Event.Type == sf::Event::Closed)
     App.Close();
    }
    App.Clear();

    temps = Clock.GetElapsedTime();   // Mesure du temps.

    if (i==99)   // Échantillonnage des données (1:100).
    {
     t[n] = temps;
     delta_t[n] = t[n] - t[n-1];
     y[n] = v[n-1]*delta_t[n-1] + y[n-1];
     v[n] = a[n-1]*delta_t[n-1] + v[n-1];
     a[n] = (DMAS*VEJECT)/(MF-DMAS*t[n])-((G*MT)/pow((RT+y[n]),2));
     cout << "t["<< std::fixed << setprecision (2) << n<<"]= "<<t[n]<<"  delta t= "<<delta_t[n]<< "   y= " << y[n] <<"   v= "<<v[n]<<"   a= "<<a[n]<< endl<<endl;
     outputFile << std::fixed << setprecision (2) << t[n]<<"    "<< y[n]<<"    "<< v[n]<<"    "<<a[n] << endl;
     n++;
     i = 0;
    }
    i++;

 // Affichage des fenêtres et du contenu à l'intérieur.

    App.Draw(Rect1);
    App.Draw(Rect2);
    App.Draw(Rect3);
    sf::String Titre1("Donnees", Arial, 25);
    sf::String Texte11("Temps (s)     :", Arial, 15);
    sf::String Texte12("Altitude (km) :", Arial, 15);
    sf::String Texte13("Vitesse (m/s) :", Arial, 15);
    sf::String Texte14("Acceleration (m/s^2) :", Arial, 15);
    Titre1.Move(50.f, 20.f);
    Texte11.Move(20.f, 80.f);
    Texte12.Move(20.f, 120.f);
    Texte13.Move(20.f, 160.f);
    Texte14.Move(20.f, 200.f);
    sf::String Titre2("Simulation graphique", Arial, 25);
    Titre2.Move(400.f, 20.f);
    sf::String Titre3("Messages", Arial, 25);
    Titre3.Move(350.f, 500.f);
    sf::String Texte30("La fusee vient de decoller.", Arial, 15);
    Texte30.Move(30.f, 550.f);
    sf::String Texte31("La fusee a atteint l'altitude de 1 km.", Arial, 15);
    Texte31.Move(30.f, 550.f);
    sf::String Texte32("Limite d'Armstrong atteinte (18,9 km).", Arial, 15);
    Texte32.Move(30.f, 550.f);
    sf::String Texte33("La fusee a atteint l'ionosphere (85 km).", Arial, 15);
    Texte33.Move(30.f, 550.f);

    App.Draw(Titre1);
    App.Draw(Texte11);
    App.Draw(Texte12);
    App.Draw(Texte13);
    App.Draw(Texte14);
    App.Draw(Titre2);
    App.Draw(Titre3);

 // Affichage des messages dans la fenêtre du bas.

    if (y[n-1] < 1000)
     App.Draw(Texte30);
    else
     if (y[n-1] < 18900)
      App.Draw(Texte31);
      else
       if (y[n-1] < 85000)
        App.Draw(Texte32);
    ;

 // Réafficher la fenêtre entière.

    App.Display();
}
        return 0;
}
 
« Modifié: Septembre 15, 2014, 12:59:17 am par Deimos »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Affichage de variables
« Réponse #1 le: Septembre 05, 2014, 08:13:33 pm »
Il suffit de créer une string avec tes valeurs numériques et l'afficher comme n'importe quelle autre string avec des sf::String.
Pour convertir tes float en string utilise un std::stringstream avec fixed et .precision(), c'est quasiment ce que tu fais déjà pour les afficher dans la console. exemple : http://stackoverflow.com/questions/5113221/decimal-points-with-stdstringstream

PS : pourquoi 1.6 si tu débutes ? On en est à la 2.1 (et bientôt même plus ;) )

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #2 le: Septembre 06, 2014, 01:51:29 am »
Merci beaucoup de ta réponse. Je vais travailler sur cette solution.

J'utilise la version SFLM 1.6 car je roule sur Debian Squeeze.


Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #3 le: Septembre 08, 2014, 09:24:02 pm »
Bonjour,

  J'ai essayé la solution proposée sur le site http://stackoverflow.com mais ça ne fonctionne pas. Le programme s'exécute et ne signale aucune erreur. Cependant, il n'affiche aucune des nouvelles variables ci-dessous. J'ai commencé par déclarer ces variables au début du programme.

   float aa = 5.23;
   float bb = 3.134;
   float cc = 3.0;

   std::stringstream ta;
   std::stringstream tb;
   std::stringstream tc;

   ta.precision(2);
   tb.precision(2);
   tc.precision(2);

   ta << fixed << aa;
   tb << fixed << bb;
   tc << fixed << cc;
 

  J'ai ensuite ajouté, dans la partie concernant l'affichage des fenêtres, quatre lignes de commandes :

 
  // Affichage des fenêtres et du contenu à l'intérieur.

    App.Draw(Rect1);
    App.Draw(Rect2);
    App.Draw(Rect3);
    sf::String Titre1("Donnees", Arial, 25);
    sf::String Texte11("Temps (s)     :", Arial, 15);

         std::stringstream tt;  // Les quatre lignes ajoutées.
         tt.precision(2);
         tt << fixed << aa << '\n' << bb << '\n' << cc << '\n';
         std::string out = tt.str();

    sf::String Texte12("Altitude (km) :", Arial, 15);
    sf::String Texte13("Vitesse (m/s) :", Arial, 15);
    sf::String Texte14("Acceleration (m/s^2) :", Arial, 15);
    Titre1.Move(50.f, 20.f);
    Texte11.Move(20.f, 80.f);
    Texte12.Move(20.f, 120.f);
    Texte13.Move(20.f, 160.f);
    Texte14.Move(20.f, 200.f);
    sf::String Titre2("Simulation graphique", Arial, 25);
    Titre2.Move(400.f, 20.f);
    sf::String Titre3("Messages", Arial, 25);
    Titre3.Move(350.f, 500.f);
    sf::String Texte30("La fusee vient de decoller.", Arial, 15);
    Texte30.Move(30.f, 550.f);
    sf::String Texte31("La fusee a atteint l'altitude de 1 km.", Arial, 15);
    Texte31.Move(30.f, 550.f);
    sf::String Texte32("Limite d'Armstrong atteinte (18,9 km).", Arial, 15);
    Texte32.Move(30.f, 550.f);
    sf::String Texte33("La fusee a atteint l'ionosphere (85 km).", Arial, 15);
    Texte33.Move(30.f, 550.f);

    App.Draw(Titre1);
    App.Draw(Texte11);
    App.Draw(Texte12);
    App.Draw(Texte13);
    App.Draw(Texte14);
    App.Draw(Titre2);
    App.Draw(Titre3);
 

Dans le programme original, j'affiche les lignes dans les fenêtres au moyen de la commande App.Draw(). Dans la solution proposée, il semble que l'on envoie le texte à imprimer dans la console et non dans la fenêtre SFML. C'est ce que je ne comprends pas.

Dans les deux lignes :

tt << fixed << aa << '\n' << bb << '\n' << cc << '\n';
std::string out = tt.str();

où sont les coordonnées comme c'est le cas par exemple dans
Texte31.Move(30.f, 550.f)
?

Merci


G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Affichage de variables
« Réponse #4 le: Septembre 08, 2014, 10:23:29 pm »
Ben c'est où que tu mets ta std::string qui s'appelle out dans un sf::String pour l'afficher ? :p
sf::String Texte69(out, Arial, 15);
App.Draw(Texte69);
par exemple

Là tu crées juste une chaine de caractère C++ (std::string) avec tes variables dedans, il faut ensuite que tu la mettes dans un sf::String et que tu affiches ce sf::String.
« Modifié: Septembre 08, 2014, 10:26:02 pm par G. »

TheKingArthur

  • Invité
Re : Affichage de variables
« Réponse #5 le: Septembre 08, 2014, 10:26:54 pm »
J'etait entrain d'écrire quand tu as posté sa ! Tu m'as coupé l'herbe sou´s le pied !

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #6 le: Septembre 09, 2014, 12:03:24 am »
Bonjour,

 Ça fonctionne! Donc, merci à vous deux.

 Il reste seulement un dernier petit détail à régler pour que la simulation soit parfaite. J'aimerais avoir une police de caractères comme Courrier New qui fait en sorte que les lettres et chiffres sont alignés verticalement comme c'est le cas dans une console ou dans gedit.

  Il y a un site (http://www.dafont.com) qui montre comment installer une police. Il parle aussi d'un répertoire .fonts. Moi, j'ai plutôt le répertoire .fontconfig et il contient huit fichiers avec des noms pas très explicites. Voici un exemple:

7ef2298fde41cc6eeb7af42e48b7d293-le32d4.cache-3

 Ici (http://sfml-dev.org/tutorials/1.6/graphics-fonts-fr.php), il montre comment charger une police avec la classe sf::Font.

Mais avant d'installer d'autres polices, j'aimerais savoir comment on fait pour connaître les polices (noms de fichiers) sous SFML qui sont déjà installées et que je pourrais choisir au lieu de la police Arial?


Merci

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Affichage de variables
« Réponse #7 le: Septembre 09, 2014, 01:50:12 am »
Y'a aucune police installée avec SFML. A part en 1.6 où il y a une police par défaut quand tu n'en charges pas. (dans les versions > 1.6 on est obligé de charger une police)
Si tu veux utiliser une police avec SFML, tu la mets avec ton executable et tu la charges comme tu le fais déjà avec ton arial. :p

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #8 le: Septembre 10, 2014, 06:24:52 pm »
Bonjour,

1. Je vais tenter d'installer une police. Mais je ne suis pas sûr de comprendre. Lorsque tu écris :
tu la mets avec ton executable

  Est-ce que tu veux dire que je dois simplement installer le fichier téléchargé dans le répertoire /src de mon projet?

2. Mais l'installation d'une nouvelle police ne réglera pas le dernier problème que j'ai observé. Lorsqu'une autre colonne de chiffre apparaît, par exemple, les dizaines, le point décimal se tasse vers la droite au lieu de rester au même endroit. Dans un vrai chronomètre numérique, le point reste à la même position et le nouveau chiffre s'ajoute à la gauche.

  Les lignes de codes qui se rapportent à l'affichage du temps sont les suivantes :
  std::stringstream texte_t;
  texte_t.precision(1);
  texte_t << fixed << "Temps (s)     :  "<< temps << '\n';
  std::string out_t = texte_t.str();
  sf::String Texte11(out_t, Arial, 15);
  Si quelqu'un a une petite idée sur ça, je vais l'essayer.

Merci

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Affichage de variables
« Réponse #9 le: Septembre 10, 2014, 09:36:59 pm »
Ben ton arial.ttf il est où ?

TheKingArthur

  • Invité
Re : Affichage de variables
« Réponse #10 le: Septembre 11, 2014, 09:28:15 pm »
Tu met ton fichier ".ttf" dans le même dossier que ton exécutable et tu le charge avec la fonction "loadFromFile()" de la classe sf::Font et ensuite tu passe ta police en paramètre du constructeur de ton sf::String à la place de "Arial".

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #11 le: Septembre 12, 2014, 06:11:38 pm »
OK. De cette façon, c'est simple. Il suffit donc de télécharger un fichier de police de caractères et de le mettre dans le répertoire de mon exécutable. Je croyais que c'était plus compliqué que ça. Je vais essayer d'en télécharger quelques uns et de les charger.

Merci beaucoup.

TheKingArthur

  • Invité
Re : Affichage de variables
« Réponse #12 le: Septembre 12, 2014, 11:37:50 pm »
De rien. Autre chose ?

Deimos

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
    • E-mail
Re : Affichage de variables
« Réponse #13 le: Septembre 15, 2014, 12:57:25 am »
Effectivement, ça fonctionne très bien. Donc, je vais clore ce sujet. Il y a juste mon chronomètre qui n'est pas parfait mais ça peut quand même aller. Le plus important a été réalisé.

Donc, merci à tous ceux qui ont contribué.