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

Auteur Sujet: Problème avec les collisions  (Lu 1574 fois)

0 Membres et 1 Invité sur ce sujet

Geeque

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
Problème avec les collisions
« le: Janvier 21, 2016, 01:41:30 pm »
Bonjour,
Afin de réaliser un projet de jeu à l'aide de la SFML et du C++ , j'ai chercher à faire des collisions à l'aide de boites englobantes en suivant le tutoriel ci-contre http://www.sfml-dev.org/tutorials/2.1/graphics-transform-fr.php
Cependant lorsque j'utilise cette méthode dans mon code (avec geany) le problème est que ma détection ne fonctionne pas et impossible de comprendre pourquoi , je viens donc sur le forum poster ma question en esperant que vous puissiez m'aider.

Le code en question :
/* Informations pour pouvoir jouer
#########################################
#               JEU-RPG-GEERAERT-QUENTIN                 
#########################################

#################################
#       NECESSITE: SFML 2.0     ET C++   
#################################

#################################################################################################      
#       COMMENT JOUER:                                                                                                                                                                                   #
#                       1)      Aller à l'emplacement où se situe le dossier du jeu                                                                                                    #
#                       2)      g++ -c Jeu.cpp                                                                                                                                                                   #
#                       3)      g++ Jeu.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio                                                   #
#                       4)      ./sfml-app                                                                                                                                                                               #
#################################################################################################
*/

#ifndef Includes        /* Includes */
#include <iostream>
#include <cmath>
#include <string>
#include <unistd.h>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#endif
#ifndef Variables       /* Variables */
int speed = 2;int entree=0;int blockSize=32;int instru=0;int screenW = 800, screenH = 600;int posdep=0;int dialogue=0;
bool updateFPS=true;bool music = true;bool debuter=false;
enum Dir{Down,Left,Right,Up}; /* Touches de deplacements */
sf::RenderWindow window; /* Fenetre */
sf::Texture perso;sf::Sprite sprite_perso; /* Personnage */
sf::Vector2i anim(1, Down);
sf::View view;
sf::SoundBuffer soundBuffer;sf::Sound sound; /* Son d'ambiance */
sf::Texture Background;sf::Sprite sprite_background; /* Affichage logo linux */
sf::Texture Inst;sf::Sprite sprite_inst; /* Instructions */
sf::Texture rect;sf::Sprite sprite_rect; /* Menu demarrer */
sf::Texture Village;sf::Sprite sprite_village; /* Village */
sf::RectangleShape vivi;
sf::FloatRect JoueurBox = sprite_perso.getGlobalBounds(); /* Rectangle contenant le Joueur */
sf::FloatRect MaisonBox = vivi.getGlobalBounds(); /* Rectangle contenant la maison test */
#endif
#ifndef Fonctions       /* Fonctions */
void message(){ /* Affichage l'avancement dans le terminal */
        /* !!! Arriver du joueur dans le jeu !!! */
        if (debuter==false){std::cout<<" > Arriver dans le jeu du joueur !"<<std::endl;debuter=true;}
        /* !!! Dialogue à afficher !!!
        if (dialogue==0){std::cout<<" > Affichage du dialogue du pécheur !"<<std::endl;dialogue++;}*/

        /* !!! Déplacement à gerer !!!
        if (dialogue==1){std::cout<<" > Déplacement du personnage vers la maison (bas,gauche) !"<<std::endl;dialogue++;}*/

}
void chargelem(){ /* Chargement */
        // Création du rectangle de choix demarrer
        if(!rect.loadFromFile("rect.png"))
                std::cout<<std::endl<<">>Erreur lors du chargement rect"<<std::endl;
        rect.setSmooth(true);
        sprite_rect.setTexture(rect);
        sprite_rect.setPosition(400,0);
       
        // Charger le fond d'ecran
        if(!Background.loadFromFile("Tux.png"))
                std::cout<<std::endl<<">>Erreur lors du chargement background"<<std::endl;
        Background.setSmooth(true);
        sprite_background.setTexture(Background);
        sprite_background.setPosition(-5,10);
       
        // Charger l'image du perso
        if(!perso.loadFromFile("image.png"))
                std::cout << ">> Erreur lors du chargement perso"<<std::endl;  
        perso.setSmooth(true);
        sprite_perso.setTexture(perso);
       
        // Charger le son
        if(!soundBuffer.loadFromFile("Mists_of_Time-4T.ogg"))
                std::cout<<">>Erreur lors du chargement audio"<<std::endl;
        sound.setBuffer(soundBuffer);
        sound.setLoop(true);
       
        // Charger les instructions
        if(!Inst.loadFromFile("fleches.jpg"))
                std::cout<<std::endl<<">>Erreur lors du chargement instruction"<<std::endl;
         Inst.setSmooth(true);
        sprite_inst.setTexture(Inst);
        sprite_inst.setPosition(100,100);      

        // Charger le village
        if(!Village.loadFromFile("village.png"))
                std::cout<<std::endl<<">>Erreur lors du chargement village"<<std::endl;
        Village.setSmooth(true);
        sprite_village.setTexture(Village);
        sprite_village.setPosition(0,0);
       
        // Créer un rectangle (test de collision)
        vivi.setFillColor(sf::Color::Blue);
        vivi.setSize(sf::Vector2f(200,100));
        vivi.setPosition(100,100);
}
void affichage(){ /* Affichage du jeu */
        if (entree==0){
                                window.draw(sprite_background);
                                window.draw(sprite_rect);
        }
        else if (entree==1){
                if (posdep==0){
                        sprite_perso.setPosition(383,887); /* Position de depart du joueur */
                        posdep=1;
                }
                //std::cout<<sprite_perso.getPosition().x<<","<<sprite_perso.getPosition().y<<std::endl;
                message();
                //window.draw(sprite_village);
                window.draw(vivi);
                window.draw(sprite_perso);
        }
}
void gestionclavier(){ /* Gestion des touches */
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
                sprite_perso.move(0,-speed);
                anim.y=Up;
                //std::cout<<" > Déplacement du personnage vers le haut "<<std::endl;
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
                sprite_perso.move(0,speed);
                anim.y=Down;
                //std::cout<<" > Déplacement du personnage vers le bas "<<std::endl;
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
                sprite_perso.move(-speed,0);
                anim.y=Left;
                //std::cout<<" > Déplacement du personnage vers la gauche "<<std::endl;
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
                sprite_perso.move(speed,0);
                anim.y=Right;
                //std::cout<<" > Déplacement du personnage vers la droite "<<std::endl;       
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return)){
                entree=1;
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){
                if (entree==1){
                        entree=0;
                }
                else if (entree==0){
                        exit(0);
                }
                       
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
                speed=3;       
        }
        else
                speed=2;
}
void son(){ /* Jouer un son d'ambiance */
        if (music==true){
                sound.play();
                music=false;
        }
}
void collision(){ /* Detection des collisions principales */
                //std::cout<<"> Position du joueur : "<<sprite_perso.getPosition().x<<","<<sprite_perso.getPosition().y<<std::endl;
        if (sprite_perso.getPosition().x<=0)                   
                sprite_perso.setPosition(sf::Vector2f(0,sprite_perso.getPosition().y));
        if (sprite_perso.getPosition().y<=0)                   
                sprite_perso.setPosition(sf::Vector2f(sprite_perso.getPosition().x,0));
        if(sprite_perso.getPosition().x>=1571)
                sprite_perso.setPosition(sf::Vector2f(1571,sprite_perso.getPosition().y));     
        if(sprite_perso.getPosition().y>=1884)
                sprite_perso.setPosition(sf::Vector2f(sprite_perso.getPosition().x,1884));
        // Collision avec la map
        if (JoueurBox.intersects(MaisonBox)){
                std::cout<< "Collision !" <<std::endl;
        }
}
void scrolling(){  /* Vue en scrolling du personnage */
        view.reset(sf::FloatRect(0,0,screenW,screenH));
        sf::Vector2f position(screenW/2,screenH/2);
        position.x=sprite_perso.getPosition().x+(blockSize/2)-(screenW/2);
        position.y=sprite_perso.getPosition().y+(blockSize/2)-(screenH/2);
        if(position.x<0)
                position.x=0;
        if(position.y<0)
                position.y=0;
        view.reset(sf::FloatRect(position.x,position.y,screenW,screenH));
        window.setView(view);                  
}
void jeu(){  /* Principal ! --- Lorsque la fenetre est ouverte */
        sf::Clock time;
        float fpsCount=0,switchFPS=100,fpsSpeed=500;
        chargelem();
        while (window.isOpen()){
                sf::Event event;
                while (window.pollEvent(event)){
                        if (event.type == sf::Event::Closed)
                                window.close();
                        if (event.type == sf::Event::KeyPressed){
                                updateFPS=true;
                        }
                        else
                                updateFPS=false;
                }
                son();         
                gestionclavier();
                if (updateFPS==true){
                        if (time.getElapsedTime().asMilliseconds()>=100){
                                anim.x--;
                                if(anim.x*blockSize>=perso.getSize().x)
                                        anim.x=2;
                                        time.restart();
                        }
                }
                sprite_perso.setTextureRect(sf::IntRect(anim.x*blockSize,anim.y*blockSize,blockSize,blockSize));
                collision();
                scrolling();
                affichage();
                window.display();
                window.clear();
        }
}
#endif
int main(){             /* Main */
        window.create(sf::VideoMode(800, 600), "JEU-GEERAERT-QUENTIN");/* Créer un fenetre de taille définie */
        window.setPosition(sf::Vector2i(0,0));/* Positionne correctement la fenetre en 0,0 */
        std::cout << std::endl<<"> Lancement du jeu :"<<std::endl;
        jeu(); /* Lancement du jeu */
}