Académique Documents
Professionnel Documents
Culture Documents
a) Ajout d’un constructeur a la classe Balle pour fixer la position initiale de la balle et
son rayon :
int main()
{
sf::RenderWindow Jeu(sf::VideoMode(800, 800), "Jeu de Pong ... M1 3EA"); // La
fenêtre de travail
// Balle B;
//a) Test de la nouvelle fonctionalite avec l'appel du Constructeur d'initialisation
Balle B(100,200,15);
1
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
//Suite du code…//ajout
}
void Balle::rebondir()
{
if (pos_x>=800) {dx = -dx; pos_x = 800-rayon;} //balle a droite
if (pos_y>=800) {dy = -dy; pos_y = 800-rayon;} //balle en bas
if (pos_y<=0) {dy = -dy; pos_y = rayon;} //balle en haut
if (pos_x<=0) {dx = -dx; pos_x = rayon;} //balle a gauche
}
Avec l’ajout de cette méthode dans la méthode move() pour s’assurer qu’à chaque déplacement,
la méthode rebondir() met à jour les paramètres si les conditions sont remplies;
void Balle::move()
{
if (clock.getElapsedTime().asMilliseconds()>=10)
{
pos_x+=dx;
pos_y+=dy;
rebondir();
clock.restart();
}
}
//classe Raquette
class Raquette
{
int dx,dy; //déplacement x, y
int pos_x,pos_y; //position x, y
sf::Clock clock; //pour gérer le temps
sf::Color couleur_trait; // couleur du trait extérieur
sf::Color couleur_remplissage; // couleur de remplissage
2
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
sf::RectangleShape rectangle; // pour le dessin d'un rectangle
//sf::FloatRect boite_englobante; // pour les collision
public:
Raquette();
Raquette(int, int);
void draw(sf::RenderTarget& Jeu);
void move();
void bouger();
};
Raquette::Raquette()
{
pos_x=15;
pos_y=0;
dy=-2;
rectangle.setSize(sf::Vector2f(10,50));
couleur_trait=sf::Color::White;
couleur_remplissage=sf::Color::White;
clock.restart();
}
void Raquette::draw(sf::RenderTarget& Jeu)
{
rectangle.setSize(sf::Vector2f(10,50));
rectangle.setFillColor(couleur_remplissage);
rectangle.setOutlineColor(couleur_trait);
rectangle.setOutlineThickness(1);
//rectangle.setOrigin(400, 400); // pour mettre l'origine au centre du cercle, sinon
coin haut gauche carré englobant !
rectangle.setPosition(pos_x, pos_y);
//boite_englobante = rectangle.getGlobalBounds(); // récupère le rectangle englobant pour
gérer les collisions avec la méthode "intersects"
Jeu.draw(rectangle);
void Raquette::move()
{
if (clock.getElapsedTime().asMilliseconds()>=10)
{
bouger();
clock.restart();
}
}
3
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
pos_x = x0;
pos_y = y0;
dy=-2;
couleur_trait=sf::Color::White;
couleur_remplissage=sf::Color::White;
clock.restart();
}
4
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
d) Modification des classes Balle et Raquette pour gérer les collisions entre une balle et
une raquette.
L’utilisation d’un pointeur sur une balle assure qu’on ne copie pas de balle, mais qu’on pointe
sur l’adresse de la balle sur l’aire de jeu.
Les classes Balle et Raquette ont été modifiées avec l’ajout de accesseurs et modificateurs pour
pouvoir obtenir leurs membres privés. Une méthode get_boite_englobante() est ajoutée à
chacune des classes pour permettre d’obtenir leur membre boite_englobante.
return true;
}
return false;
}
5
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
//break;
}
L’acceleration est obtenue en augmentant la valeur de dx, chaque fois que la balle rebondit.
void Balle::rebondir()
{ acceleration+=1;
if (pos_x>=X) {dx = -dx; pos_x = X-rayon;} //balle a droite
if (pos_y>=Y) {dy = -dy; pos_y = Y-rayon;} //balle en bas
if (pos_y<=0) {dy = -dy; pos_y = rayon;} //balle en haut
if (pos_x==0) {dx = -dx-acceleration; pos_x = rayon;} //balle a gauche
}
6
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
Defi 2 –
Quelques modifications légères ont été apportées au jeu à une seule raquette pour l’adapter à un
jeu à 2 raquettes.
Cette fois-ci la balle peut traverser aussi le mur droit, et faire un - Game Over !. La méthode
balle_tranverse_mur_gauche() a été modifiée en balle_traverse_mur_gauche_droite() pour tenir
compte du mur droit lorsqu’il y a 2 raquettes.
7
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
8
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
//classe Balle
class Balle
{
int dx,dy; //déplacement x, y
int pos_x,pos_y; //position x, y
int rayon; //rayon
sf::Clock clock; //pour gérer le temps
sf::Color couleur_trait; // couleur du trait extérieur
sf::Color couleur_remplissage; // couleur de remplissage
sf::CircleShape circle; // pour le dessin
sf::FloatRect boite_englobante; // pour les collision
int acceleration;
public:
Balle();
Balle(int, int, int);
void draw(sf::RenderTarget& Jeu);
void move();
void rebondir();
sf::FloatRect get_boite_englobante();
int get_pos_x();
int get_pos_y();
int get_rayon();
void set_pos_x(int);
void set_pos_y(int);
void set_dx(int);
int get_dx();
void set_dy(int);
int get_dy();
bool balle_traverse_mur_gauche_droite();
};
Balle::Balle()
{
pos_x=X/2;
9
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
pos_y=Y/2;
dx=3;
dy=-2;
rayon=10;
couleur_trait=sf::Color::White;
couleur_remplissage=sf::Color::White;
clock.restart();
}
void Balle::draw(sf::RenderTarget& Jeu)
{
circle.setRadius(rayon);
circle.setFillColor(couleur_remplissage);
circle.setOutlineColor(couleur_trait);
circle.setOutlineThickness(1);
circle.setOrigin(rayon, rayon); // pour mettre l'origine au centre du cercle, sinon coin
haut gauche carré englobant !
circle.setPosition(pos_x, pos_y);
boite_englobante = circle.getGlobalBounds(); // récupère le rectangle englobant pour gérer
les collisions avec la méthode "intersects"
Jeu.draw(circle);
}
void Balle::move()
{
if (clock.getElapsedTime().asMilliseconds()>=10)
{
pos_x+=dx;
pos_y+=dy;
rebondir();
clock.restart();
}
}
//a) ajout de constructeur pour fixer la position et le rayon de la balle
Balle::Balle(int x0, int y0, int r)
{
pos_x = x0;
pos_y = y0;
rayon = r;
dx=3;
dy=-2;
couleur_trait=sf::Color::White;
couleur_remplissage=sf::Color::White;
clock.restart();
}
10
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
//b) Rajout de la méthode rebondir
/*
a. Elle touche le mur droit … on inverse son déplacement « dx » et on fixe pox_x avec la valeur
« 800-rayon »
b. Elle touche le mur bas … on inverse son déplacement « dy » et on fixe pox_y avec la valeur «
800-rayon »
c. Elle touche le mur haut … on inverse son déplacement « dy » et on fixe pox_y avec la valeur «
rayon »
d. Elle touche le mur gauche … on inverse son déplacement « dx » et on fixe pox_x avec la
valeur « rayon »
*/
void Balle::rebondir()
{ acceleration+=1;
if (pos_x==X) {dx = -dx; pos_x = X-rayon;} //balle a droite
if (pos_y>=Y) {dy = -dy; pos_y = Y-rayon;} //balle en bas
if (pos_y<=0) {dy = -dy; pos_y = rayon;} //balle en haut
if (pos_x==0) {dx = -dx-acceleration; pos_x = rayon;} //balle a gauche
}
bool Balle::balle_traverse_mur_gauche_droite()
{
if(pos_x<=0 || pos_x>=X){return true;}
return false;
}
//recuperation de la boite englobante de Balle
sf::FloatRect Balle::get_boite_englobante() {return boite_englobante;}
//classe Raquette
class Raquette
{
int dx,dy; //déplacement x, y
int pos_x,pos_y; //position x, y
sf::Clock clock; //pour gérer le temps
sf::Color couleur_trait; // couleur du trait extérieur
sf::Color couleur_remplissage; // couleur de remplissage
11
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
sf::RectangleShape rectangle; // pour le dessin d'un rectangle
sf::FloatRect boite_englobante; // pour les collisions
bool raquette_droit;
public:
Raquette();
Raquette(int, int, bool);
void draw(sf::RenderTarget& Jeu);
void move();
void bouger();
sf::FloatRect get_boite_englobante();
int get_pos_x();
};
Raquette::Raquette()
{
pos_x=15; //position raquette a 15pts, en haut
pos_y=0;
dy=-2;
//rectangle.setSize(sf::Vector2f(10,100));
couleur_trait=sf::Color::White;
couleur_remplissage=sf::Color::White;
clock.restart();
}
void Raquette::draw(sf::RenderTarget& Jeu)
{
rectangle.setSize(sf::Vector2f(10,50));
rectangle.setFillColor(couleur_remplissage);
rectangle.setOutlineColor(couleur_trait);
rectangle.setOutlineThickness(1);
//rectangle.setOrigin(400, 400); // pour mettre l'origine au centre du cercle, sinon
coin haut gauche carré englobant !
rectangle.setPosition(pos_x, pos_y);
boite_englobante = rectangle.getGlobalBounds(); // récupère le rectangle englobant pour
gérer les collisions avec la méthode "intersects"
Jeu.draw(rectangle);
}
void Raquette::move()
{
if (clock.getElapsedTime().asMilliseconds()>=10)
{
bouger();
clock.restart();
}
}
12
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
pos_y+=dy;
if (pos_y<=0) { pos_y = dy;}//rectangle.getSize().y;} //raquette touche le bord haut
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
pos_y-=dy;
if (pos_y>=Y-rectangle.getSize().y) {pos_y=Y-rectangle.getSize().y;}//raquette touche
le bord bas}
}
}
else{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
pos_y+=dy;
if (pos_y<=0) { pos_y = dy;}//rectangle.getSize().y;} //raquette touche le bord haut
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
pos_y-=dy;
if (pos_y>=Y-rectangle.getSize().y) {pos_y=Y-rectangle.getSize().y;}//raquette touche
le bord bas}
}
}
}
13
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
//getter et setter de la callse Raquette
int Raquette::get_pos_x(){return pos_x;}
return true;
}
return false;
}
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <string> //pour permettre de convertir les nombre en chaine de caracteres
#include "headers.h" // contient les fichiers d'implementation
int main()
{ //Code pour l'affichage des points
int score1 = 0; //pour comptabiliser les points
int score2 = 0; //pour comptabiliser les points
string msg1;
string msg2;
sf::Font font;
font.loadFromFile("arial.ttf");
// formatage du text
sf::Text text1("--", font);
sf::Text text2("--", font);
sf::Text gameOver("",font);
text1.setCharacterSize(30);
text1.setStyle(sf::Text::Bold);
text1.setFillColor(sf::Color::White);
text2.setCharacterSize(30);
text2.setStyle(sf::Text::Bold);
text2.setFillColor(sf::Color::White);
gameOver.setCharacterSize(50);
14
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
gameOver.setStyle(sf::Text::Bold);
gameOver.setFillColor(sf::Color::Red);
//Fin de code pour afficher
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Add))
{
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Subtract))
{
}
default :
break;
15
Moudinet Passoret
M2-E3A 2022 UPJV TP3 – GENIE INFORMATIQUE
}
}
}
return 0;
}
16