if(!test.intersects(rect2.getGlobalBounds()))
{
sprite_perso.move(mouvement);
}
else
{
std::cout << "collision" << std::endl;
}
if(!test.intersects(rect.getGlobalBounds()))
{
sprite_perso.move(mouvement);
collision = false;
}
else
{
std::cout << "collision" << std::endl;
}
Si je supprime "sprite_perso.move(mouvement);" à l'un ou un l'autre, mon personnage collisionne le mur
Mais, si je met les deux "sprite_perso.move(mouvement);" le message "collision" s'affiche bien mais hélasse personnage bouge toujours...
Je vous passe toutes mes lignes de codes, car il serais alors surement possible que le bug vienne d'autre chose...
Main.cpp
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
#include <cstdlib>
#include <cmath>
#include "Shape.h"
bool collision = false;
sf::RenderWindow window;
sf::RectangleShape rect;
sf::RectangleShape rect2;
int speed = 2;
sf::Vector2i positionSouris;
sf::Texture perso;
sf::Sprite sprite_perso;
enum Dir{ Down, Left, Right, Up };
sf::Vector2i anim(1, Down);
bool updateFPS = true;
int blockSize = 32;
int blockDemiSize = 16;
/**[Les Void] **/
void gestion_Persocollision();
void gestion_souris();
/**[Les Void] **/
int main()
{
//Création de la fenêtre 800x600
window.create(sf::VideoMode(800, 600), "Test SFML");
//Modifier la position
window.setPosition(sf::Vector2i(192, 0));
window.setFramerateLimit(60);
std::cout << "Lancement du jeu" << std::endl;
rect = PB_Rect(400, 300, 100, 100);
rect2 = PB_Rect(100, 300, 100, 100);
sf::Clock time;
if (!perso.loadFromFile("resources/image.png"))
{
std::cout << "Erreur chargement de image.png" << std::endl;
}
//En pofine les FPS
perso.setSmooth(true);
sprite_perso.setTexture(perso);
//Tant que la fenêtre est ouverte...
while (window.isOpen())
{
sf::Event event;
//Test des événements
while (window.pollEvent(event))
{
//Si on clique sur fermer
if (event.type == sf::Event::Closed)
window.close(); //On ferme la fenêtre
if (event.type == sf::Event::KeyPressed)
{ /*Pour activer l'anim*/
updateFPS = true;
}
else
updateFPS = false;
anim.x = 1;
}
/**[Les Void] **/
gestion_Persocollision();
gestion_souris();
/**[Les Void] **/
if (updateFPS == true)
{
if (time.getElapsedTime().asMilliseconds() >= 50)
{ /*On change d'animation toutes les 50 milli secondes*/
anim.x--;
if (anim.x * blockSize >= perso.getSize().x)
anim.x = 2;
time.restart(); /*On relance le timer*/
std::cout << "X: " << sprite_perso.getPosition().x << " Y: " << sprite_perso.getPosition().y << std::endl;
}
}
//on "coupe" les parties de l'image pour les réutiliser en animation..
sprite_perso.setTextureRect(sf::IntRect(anim.x * blockSize, anim.y * blockSize, blockSize, blockSize));
// On dessine, on affiche et on met à jour
window.draw(rect);
window.draw(rect2);
window.draw(sprite_perso);
window.display();
window.clear();
}
return 0;
}
void gestion_souris() /** changer "sprite" par "rect" **/
{
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
{
//On récupère les coordonnées de la souris
positionSouris = sf::Mouse::getPosition(window);
//std::cout << "Mouse.x" << positionSouris.x << "Mouse.y" << positionSouris.y << std::endl;
int mouseX = positionSouris.x;
int mouseY = positionSouris.y;
sprite_perso.setPosition(mouseX, mouseY); // On positionne le rect
}
}
void gestion_Persocollision()
{
sf::Vector2f mouvement(0,0);
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
mouvement.y -= speed;
anim.y = Up;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
mouvement.y += speed;
anim.y = Down;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
mouvement.x += speed;
anim.y = Right;
}
if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
mouvement.x -= speed;
anim.y = Left;
}
sf::FloatRect test(sprite_perso.getPosition().x + mouvement.x,
sprite_perso.getPosition().y + mouvement.y,
sprite_perso.getGlobalBounds().height,
sprite_perso.getGlobalBounds().width);
if(!test.intersects(rect2.getGlobalBounds()))
{
sprite_perso.move(mouvement);
collision = false;
}
else
{
std::cout << "collision" << std::endl;
}
if(!test.intersects(rect.getGlobalBounds()))
{
sprite_perso.move(mouvement);
collision = false;
}
else
{
std::cout << "collision" << std::endl;
}
}
Shape.h
#ifndef DEF_SHAPE
#define DEF_SHAPE
#include <SFML/Graphics.hpp>
sf::RectangleShape PB_Rect(int posX, int posY, int width, int height)
{
sf::RectangleShape rect(sf::Vector2f(width, height));
rect.setPosition(posX, posY);
rect.setFillColor(sf::Color(255, 0, 0, 255));
return rect;
}
#endif // DEF_SHAPE