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

Auteur Sujet: Collision Tilemap  (Lu 29358 fois)

0 Membres et 1 Invité sur ce sujet

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #60 le: Mai 26, 2014, 06:30:27 pm »
Ou et comment as tu défini ton rect2 ? Il correspond bien à la boîte englobante du deuxième mur t'es sur ?
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

spyker18

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
Re : Collision Tilemap
« Réponse #61 le: Mai 26, 2014, 07:24:47 pm »
salut!

auffette j'ai fait tout comme le rect en rajoutant "2" :D

Mais a ce que j'ai vu, quan dje supprime "rect" le rect2 a la collision(mais du coup pas le 1)

spyker18

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
Re : Collision Tilemap
« Réponse #62 le: Mai 27, 2014, 06:07:05 pm »
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
 

spyker18

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
Re : Collision Tilemap
« Réponse #63 le: Mai 28, 2014, 02:07:50 pm »
Bonjours je crois avoir trouver mon problème :

sprite_perso.move(mouvement); //Je l'ai mis plus loins juste avant que l'on affiche (window.draw(..)

 if(!test.intersects(rect.getGlobalBounds()))
            {
            rect.setFillColor(sf::Color::Blue);
            }
            else
            {
            rect.setFillColor(sf::Color::Red);
            }

 if(!test.intersects(rect2.getGlobalBounds()))
            {
            rect2.setFillColor(sf::Color::Blue);
            }
            else
            {
            rect2.setFillColor(sf::Color::Red);
            }
}

Quand je collisionne un des deux carrés, il se met en rouge.

Donc mon problème vien de mon "sprite_perso" car il bouge que sur un carré, est t'il possible que ça vienne de ce sprite?

OualidH38

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #64 le: Mai 28, 2014, 07:02:29 pm »
Essai ça:

if(test.intersects(rect2.getGlobalBounds()) || test.intersects(rect.getGlobalBounds()))
            {
            std::cout << "collision" << std::endl;
            }
 else
            {
             sprite_perso.move(mouvement);
            }
« Modifié: Mai 28, 2014, 07:05:07 pm par OualidH38 »

spyker18

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
Re : Collision Tilemap
« Réponse #65 le: Mai 29, 2014, 11:12:34 am »
Super merci!
ça marche!

Mais pourquoi avant ça ne marchiat pas c'est la SFML qui a buger, je supose?
Vus dans plein de forum en conseil de mettre "si tu n'intersecte pas" il y aurais pas un "sprite_perso.dontMove(mouvement)"  ;D

OualidH38

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #66 le: Mai 29, 2014, 11:37:53 am »
Non le problème venait de tes conditions if, tu avais une première condition qui disait :
- Si il n'y a pas de collision entre test et rect2 -> alors on fait bouger le sprite.
- Sinon -> écrit "collision" en console.

Et la deuxième condition qui disait :
- Si il n'y a pas de collision entre test et rect -> alors on fait bouger le perso.
- Sinon -> écrit "collision" en console.

Le problème il est là, imagine que "test" soit en collision avec "rect2" mais pas avec "rect", que va t-il se passer?

La première condition va dire :
"test est en collision avec "rect2", donc on affiche "collision" en console sans faire bouger le sprite.
La seconde condition va dire :
"test" n'est pas en collision avec "rect", donc on fait bouger le sprite.

Donc même s'il y avait collision entre test et l'un des rect le sprite bouger toujours.

Le code qui fonctionne dit seulement:
- S'il y a collision entre "test" et "rect2" ou entre "test" et "rect" -> alors affiche "collision" en console.
- Sinon -> faire bouger le sprite.

Donc s'il y a collision avec "rect2" ou bien "rect" le sprite ne bougera pas.

Hésite pas à poser des questions si tu n'as pas compris  ;)
« Modifié: Mai 29, 2014, 11:46:37 am par OualidH38 »

spyker18

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
Re : Collision Tilemap
« Réponse #67 le: Mai 29, 2014, 04:53:08 pm »
Ok merci :)