C++ > Casse Brique

TitreCasse Brique
Postée le31-12-2008
Affichée1648
Mini-lien
Description

l'application n'a pas pu démarrer car sa configuration côte-à-côte est incorrecte

EtatNe contient pas d'erreurs. Ne contient pas d'erreurs.
Code d'insertion
Options
Afficher les numéros de lignes  Mettre la source en plein ecran  Selectionner la source  Partager sur Facebook 
Téléchargement Telecharger en format txt  Telecharger en format pdf  Telecharger en format cpp
Plein ecran
#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;
}