Bonjour à tous,
Je suis actuellement en seconde année de BTS Systèmes Numériques option Informatique et Réseaux et notre professeur nous a proposé de travailler avec SFML pendant les vacances scolaires. Nous sommes libres dans le choix de ce que nous voulons faire à condition d'utiliser un peu tous les points de cours que l'on a aborder.
J'ai donc décidé de partir dans un premier temps sur une création dynamique de différentes formes (des boules et des rectangles) sans textures particulières. La création et l'initialisation de mes vecteurs de boules et de rectangles se passent très bien, le problème c'est lorsque je les positionne. J'ai une erreur de ce type :
Lorsque j'effectue un débogage pas-à-pas, je me rends compte que l'erreur apparaît dans mon main() dans la fonction Initialisation_Objets() lorsque j'éxécute Les_Formes.Positionne_Boules();
Je travaille sur Visual Studio en C++.
Voici mon code entier :
C_FORME.h
#include <SFML\Graphics.hpp>
#include <iostream>
#include <vector>
#include "C_BOULE.h"
#include "C_RECTANGLE.h"
#include "T_XY.h"
using namespace std;
using namespace sf;
class C_FORME
{
public:
C_FORME();
~C_FORME();
void Ajoute_Boule(C_BOULE*);
void Ajoute_Rectangle(C_RECTANGLE*);
inline void Positionne_Boules();
inline void Positionne_Rectangles();
protected :
vector<C_BOULE*> Les_Boules;
vector<C_RECTANGLE*> Les_Rectangles;
};
void C_FORME::Positionne_Boules()
{
/*vector<C_BOULE*>::iterator L_Index;
for (L_Index = Les_Boules.begin(); L_Index != Les_Boules.end(); L_Index++) {
(*L_Index)->Positionne_Toi();
}*/
try {
for (auto L_Boule : Les_Boules) {
if (L_Boule) L_Boule->Positionne_Toi();
}
}
catch (C_BOULE* P_Boule) {
cout << "ERREUR" << P_Boule << endl;
}
}
void C_FORME::Positionne_Rectangles()
{
/*vector<C_RECTANGLE*>::iterator L_Index;
for (L_Index = Les_Rectangles.begin(); L_Index != Les_Rectangles.end(); L_Index++) {
(*L_Index)->Positionne_Toi();
}*/
try {
for (auto L_Rectangle : Les_Rectangles) {
if (L_Rectangle) L_Rectangle->Positionne_Toi();
}
}
catch (C_RECTANGLE* P_Rectangle) {
cout << "ERREUR" << P_Rectangle << endl;
}
}
C_FORME.cpp
#include "C_FORME.h"
#include <SFML\Graphics.hpp>
C_FORME::C_FORME()
{
Les_Boules.reserve(10);
Les_Rectangles.reserve(10);
}
C_FORME::~C_FORME()
{
}
void C_FORME::Ajoute_Boule(C_BOULE* P_Boule)
{
Les_Boules.push_back(P_Boule);
}
void C_FORME::Ajoute_Rectangle(C_RECTANGLE* P_Rectangle)
{
Les_Rectangles.push_back(P_Rectangle);
}
C_BOULE.h
#include <SFML\Graphics.hpp>
#include "T_XY.h"
using namespace sf;
class C_BOULE
{
public:
C_BOULE();
C_BOULE(float, const T_XY&);
~C_BOULE();
inline void Positionne_Toi();
inline void Dessine_Toi(RenderWindow*);
protected :
T_XY Position;
float Rayon;
CircleShape* La_Boule;
};
void C_BOULE::Positionne_Toi()
{
La_Boule->setPosition(Position.X, Position.Y);
}
void C_BOULE::Dessine_Toi(RenderWindow* P_Fenetre)
{
P_Fenetre->draw(*La_Boule);
}
C_BOULE.cpp
#include "C_BOULE.h"
C_BOULE::C_BOULE()
:Position{ 0, 0 }, Rayon(10)
{
}
C_BOULE::C_BOULE(float P_Rayon, const T_XY& P_Position)
:Rayon(P_Rayon), Position(P_Position), La_Boule(nullptr)
{
}
C_BOULE::~C_BOULE()
{
}
C_RECTANGLE.h
#include <SFML\Graphics.hpp>
#include "T_XY.h"
using namespace sf;
class C_RECTANGLE
{
public:
C_RECTANGLE();
C_RECTANGLE(float, float, const T_XY&);
~C_RECTANGLE();
inline void Positionne_Toi();
inline void Dessine_Toi(RenderWindow*);
protected :
T_XY Position;
float Longueur;
float Largeur;
RectangleShape* Le_Rectangle;
};
void C_RECTANGLE::Positionne_Toi()
{
Le_Rectangle->setPosition(Position.X, Position.Y);
}
void C_RECTANGLE::Dessine_Toi(RenderWindow* P_Fenetre)
{
P_Fenetre->draw(*Le_Rectangle);
}
C_RECTANGLE.cpp
#include "C_RECTANGLE.h"
C_RECTANGLE::C_RECTANGLE()
:Position{ 0, 0 }, Longueur(120), Largeur (50)
{
}
C_RECTANGLE::C_RECTANGLE(float P_Longueur, float P_Largeur, const T_XY& P_Position)
:Longueur(P_Longueur), Largeur(P_Largeur), Position(P_Position), Le_Rectangle(nullptr)
{
}
C_RECTANGLE::~C_RECTANGLE()
{
}
T_XY.h
struct T_XY
{
float X;
float Y;
inline void operator++(int);
inline void operator--(int);
inline void operator+=(const T_XY&);
inline void operator-=(const T_XY&);
};
void T_XY::operator++(int)
{
X++;
Y++;
}
void T_XY::operator--(int)
{
X--;
Y--;
}
void T_XY::operator+=(const T_XY& P_Avec)
{
X += P_Avec.X;
Y += P_Avec.Y;
}
void T_XY::operator-=(const T_XY& P_Avec)
{
X -= P_Avec.X;
Y -= P_Avec.Y;
}
C_ENVIRONNEMENT.h
class C_ENVIRONNEMENT
{
public :
static C_ENVIRONNEMENT* Get_Environnement();
float Get_X_MIN() { return X_MIN; }
float Get_X_MAX() { return X_MAX; }
float Get_Y_MIN() { return Y_MIN; }
float Get_Y_MAX() { return Y_MAX; }
protected :
C_ENVIRONNEMENT();
static C_ENVIRONNEMENT* Environnement;
float X_MIN;
float X_MAX;
float Y_MIN;
float Y_MAX;
};
C_ENVIRONNEMENT.cpp
#include "C_ENVIRONNEMENT.h"
C_ENVIRONNEMENT* C_ENVIRONNEMENT::Environnement = nullptr;
C_ENVIRONNEMENT::C_ENVIRONNEMENT()
:X_MIN(0.0f), X_MAX(640.0f), Y_MIN(0.0f), Y_MAX(400.0f)
{
}
C_ENVIRONNEMENT* C_ENVIRONNEMENT::Get_Environnement()
{
if (Environnement == nullptr) Environnement = new C_ENVIRONNEMENT;
return Environnement;
}
Main.cpp
#include <SFML\Graphics.hpp>
#include <iostream>
#include <vector>
#include "C_ENVIRONNEMENT.h"
#include "T_XY.h"
#include "C_FORME.h"
#include "C_BOULE.h"
#include "C_RECTANGLE.h"
using namespace std;
using namespace sf;
RenderWindow* Fenetre_Principale;
C_FORME Les_Formes;
C_ENVIRONNEMENT* Mon_Environnement = C_ENVIRONNEMENT::Get_Environnement();
//========================================
void Initialisation_Objets()
{
Les_Formes.Ajoute_Boule(new C_BOULE(10, T_XY{ 10, 10 }));
Les_Formes.Ajoute_Boule(new C_BOULE(20, T_XY{ 30, 30 }));
Les_Formes.Ajoute_Rectangle(new C_RECTANGLE(120, 50, T_XY{ 100, 100 }));
Les_Formes.Ajoute_Rectangle(new C_RECTANGLE(100, 30, T_XY{ 200, 200 }));
Les_Formes.Positionne_Boules();
Les_Formes.Positionne_Rectangles();
}
//-----------------------------------
void Gestion_Entrees()
{
static Event L_Evenement;
while (Fenetre_Principale->pollEvent(L_Evenement)) {
if (L_Evenement.type == Event::Closed) Fenetre_Principale->close();
}
}
//-----------------------------------
void Affichage()
{
Fenetre_Principale->clear();
//.............
//.............
Fenetre_Principale->display();
}
//-----------------------------------
int main()
{
Fenetre_Principale = new RenderWindow (VideoMode(Mon_Environnement->Get_X_MAX(), Mon_Environnement->Get_Y_MAX()),"Test SFML");
Initialisation_Objets();
while (Fenetre_Principale->isOpen()) {
Gestion_Entrees();
Affichage();
}
return 0;
}
Merci d'avance pour le temps que vous prenez à lire mon message ainsi que pour votre éventuelle aide qui me sera précieuse !
Cordialement,
Milan.