#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <fstream>
#include <cmath>
#define PI 3.14159265
// Fonction de collision Point / Barre
bool CollisionPointBarre (sf::Vector2f Point, sf::Shape Barre, float Largeur, float Hauteur)
{
if (Point.x<Barre.GetPosition().x-Largeur/2
|| Point.x>Barre.GetPosition().x+Largeur/2
|| Point.y<Barre.GetPosition().y-Hauteur/2
|| Point.y>Barre.GetPosition().y+Hauteur/2)
return false;
else
return true;
}
// Fonction de collision Balle / Barre
bool CollisionBalleBarre (sf::Shape Balle, sf::Shape Barre, float Largeur, float Hauteur)
{
if (CollisionPointBarre(sf::Vector2f(Balle.GetPosition().x-5, Balle.GetPosition().y-5), Barre, Largeur, Hauteur)
|| CollisionPointBarre(sf::Vector2f(Balle.GetPosition().x-5, Balle.GetPosition().y+5), Barre, Largeur, Hauteur)
|| CollisionPointBarre(sf::Vector2f(Balle.GetPosition().x+5, Balle.GetPosition().y-5), Barre, Largeur, Hauteur)
|| CollisionPointBarre(sf::Vector2f(Balle.GetPosition().x+5, Balle.GetPosition().y+5), Barre, Largeur, Hauteur))
return true;
else
return false;
}
int briques (bool Tableau[12][20])
{
int n=0;
for(int i=0 ; i<12 ; i++)
for(int j=0 ; j<20 ; j++)
if (Tableau[i][j])
n++;
return n;
}
// Fonction Main
int main (void)
{
// Chargement du niveau
bool Tableau[12][20];
for (int i=0 ; i<12 ; i++)
for(int j=0 ; j<20 ; j++)
Tableau[i][j] = (int)(sf::Randomizer::Random(0, 1));
// Création de la fenetre
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Casse Brique");
App.SetBackgroundColor(sf::Color(22, 136, 7));
// Création des objets
sf::Shape Barre = sf::Shape::Rectangle(-49.f, -4.f, 49.f, 4.f, sf::Color(100, 0, 0), 1.f, sf::Color(0, 0, 0));
Barre.Move(400.f, 585.f);
sf::Shape Balle = sf::Shape::Circle(0.f, 0.f, 4.f, sf::Color(0, 0, 100), 1.f, sf::Color(0, 0, 0));
Balle.Move(400.f, 570.f);
sf::Shape Brique = sf::Shape::Rectangle(-24.f, -9.f, 24.f, 9.f, sf::Color(200, 10, 10), 1.f, sf::Color(255, 255, 255));
// Caractéristiques de la balle
float DirectionX = 0.f;
float DirectionY = -1.f;
const float VitesseBalle = 250.f;
// Caractéristiques de la barre
const float VitesseBarre = 400.0f;
// Gestion du texte
sf::String Texte("", sf::Font::GetDefaultFont(), 50);
sf::Clock Clock;
// Boucle principale
bool Running = true;
while (App.IsOpened())
{
// Gestion des évènements
sf::Event Event;
while (App.GetEvent(Event))
{
if ((Event.Type == sf::Event::Closed) ||
((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)))
App.Close();
}
// En Jeu
if (Running)
{
// Déplacement de la barre
if (App.GetInput().IsKeyDown(sf::Key::Left) && Barre.GetPosition().x-50>0)
Barre.Move(-VitesseBarre * App.GetFrameTime(), 0);
if (App.GetInput().IsKeyDown(sf::Key::Right) && Barre.GetPosition().x+50<800)
Barre.Move(VitesseBarre * App.GetFrameTime(), 0);
// Déplacement de la balle
Balle.Move(DirectionX * VitesseBalle * App.GetFrameTime(), DirectionY * VitesseBalle * App.GetFrameTime());
// Gestion des collisions (Balle / Décors)
if (Balle.GetPosition().x-5<0)
DirectionX = abs(DirectionX);
else if (Balle.GetPosition().x+5>800)
DirectionX = -abs(DirectionX);
if (Balle.GetPosition().y-5<0)
DirectionY = 1;
if (Balle.GetPosition().y-5>600)
{
// Game Over
Running = false;
Texte.SetText("Vous avez perdu !");
Clock.Reset();
}
// Gestion des collisions (Balle / Barre)
if (CollisionBalleBarre(Balle, Barre, 100, 10))
{
// Modification de la direction en abscisse
DirectionX = (Balle.GetPosition().x - Barre.GetPosition().x) / 30;
DirectionY = -abs( cos( PI/2 - atan(-1/DirectionX) ) );
}
// Gestion des collisions (Balle / Briques)
for (int i=0 ; i<12 ; i++)
for (int j=0 ; j<20 ; j++)
if (Tableau[i][j])
{
sf::Vector2f PositionBrique = sf::Vector2f(100.f + 50.f * i + 25.f, 50.f + 20.f * j + 10.f);
Brique.SetPosition(PositionBrique);
if (CollisionBalleBarre(Balle, Brique, 50, 20))
{
if (Balle.GetPosition().y<PositionBrique.y-13)
DirectionY = -abs(DirectionY);
else if (Balle.GetPosition().y>PositionBrique.y+13)
DirectionY = abs(DirectionY);
else if (Balle.GetPosition().x<PositionBrique.x)
DirectionX = -abs(DirectionX);
else
DirectionX = abs(DirectionX);
// On détruit la brique
Tableau[i][j] = false;
}
}
// Plus de brique en jeu
if (briques(Tableau)==0)
{
// Game Over
Running = false;
Texte.SetText("Vous avez gagné !");
Clock.Reset();
}
}
else
{
// Fin : Affichage Victoire / Défaite
App.Draw(Texte);
// Attente
if (Clock.GetElapsedTime()>2)
App.Close();
}
// On déssine les objets a l'écran
App.Draw(Barre);
App.Draw(Balle);
for (int i=0 ; i<12 ; i++)
for (int j=0 ; j<20 ; j++)
if (Tableau[i][j])
{
sf::Vector2f PositionBrique = sf::Vector2f(100.f + 50.f * i + 25.f, 50.f + 20.f * j + 10.f);
Brique.SetPosition(PositionBrique);
App.Draw(Brique);
}
// Affichage de l'écran
App.Display();
}
// Retour
return EXIT_SUCCESS;
}