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.phpCependant 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 */
}