Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Geeque le Mai 27, 2016, 10:20:18 pm

Titre: [Résolu]TileMap et collision avec un sprite[Résolu]
Posté par: Geeque le Mai 27, 2016, 10:20:18 pm
Bonjour / Bonsoir à tous,

Je travaille actuellement sur un petit projet de Mario en mode arcade, et pour le moment je possède:
          - Un chargement d'ennemi aléatoire
          - Un personnage
          - Une map générée grâce à un fichier.txt sous la forme de int level[ y ][ x ] (Je commence à parcourir le tableau par les y)
          - Une class Scene.hpp qui se charge d'afficher le personnage ainsi que les ennemis
          - Une class Application.hpp qui permet d'afficher la map ainsi que les éléments de la class Scene

Pour le personnage ainsi que les ennemis je possède une class spécifique. Après avoir recherché des solutions via le site de la SFML ainsi que des vidéos Youtube comme CodingMadeEasy je ne suis pas parvenu à détecter mes collisions. Je vous joint les fichiers en ce qui concerne la map en question, en espérant que vous puissiez m'aider.
Titre: Re : TileMap et collision avec un sprite
Posté par: Laurent le Mai 28, 2016, 09:29:13 am
Tu n'as pas plus pratique que des captures d'écran pour montrer ton code ? ???

Et peux-tu décrire ton problème plus précisément que "j'y arrive pas" ? Tu as essayé quoi, et qu'est-ce qui ne marche pas exactement ?
Titre: Re : TileMap et collision avec un sprite
Posté par: Geeque le Mai 28, 2016, 10:19:46 am
En fait je possède un tableau en 2 dimensions avec lequel je voudrais faire des collisions avec mon sprite quand la tuile est différente de 30 (tuile vide). Du coup dans personnage.hpp j'ai les méthodes qui me retourne la position en x et en y de mon joueur et j'ai _masque qui est une copie de level mais lorsque je tente de faire
if(_masque [_perso.PosX ()][_perso.PosY ()]!=30)
{
    cout <<"collision"<<endl;
}

Ce qu'il se passe est que je détecte bien ma collision mais qu'au bout de x temps j'ai un segmentation fault à cause de la taille de mon tableau par rapport à la position du sprite et ne voit pas comment régler ce soucis car en augmentant la taille de celui-ci je ne détecte plus correctement la collision.
Titre: Re : TileMap et collision avec un sprite
Posté par: Laurent le Mai 28, 2016, 10:42:43 am
Citer
au bout de x temps j'ai un segmentation fault à cause de la taille de mon tableau par rapport à la position du sprite
C'est-à-dire ?
Titre: Reponse
Posté par: Geeque le Mai 28, 2016, 10:52:47 am
Comme mon tableau _mapping[ 19 ] [26 ] , mon sprite est capable de se déplacer au delà de ses bornes car ma fenêtre fait 800*600 ce qui fait que lorsque mon joueur arrive à  x >=50 ou x<0 (je ne saurais expliquer ces chiffres) un segmentation fault se passe alors que si justement je divise la taille de mon joueur je n'ai plus cette erreur mais du coup la collision n'est pas reconnue
Titre: Re : TileMap et collision avec un sprite
Posté par: Laurent le Mai 28, 2016, 11:06:31 am
Donc il suffit de tester si les coordonnées X et Y du personnage sont bien dans les limites de ton tableau avant d'y accéder, non ?
Titre: Re : TileMap et collision avec un sprite
Posté par: Geeque le Mai 28, 2016, 11:21:06 am
Oui je suis d'accord cependant dans tout les cas mon personnage doit pouvoir y acceder afin d'appliquer ce test sur la totalité de la map
Titre: Re : TileMap et collision avec un sprite
Posté par: G. le Mai 28, 2016, 12:20:15 pm
Pour récupérer la position d'une tile dans un tableau correspondant à la position de ton perso, il faut diviser la position du perso par la taille d'une tile.

Si ton perso est en 200, 300, tu vas pas checker la tile qui est en _mappin[200][300] non ?
Tu n'as pas plus pratique que des captures d'écran pour montrer ton code ? ???
Apparemment non. :o
Titre: Re : TileMap et collision avec un sprite
Posté par: Geeque le Mai 28, 2016, 12:48:19 pm
Finalement j'ai reussi à créer des sf::RectangleShape qui arrive à recuperer la position de mes collisons mais quand je test mes headbox rien n'affiche les collisions.
Ce qui teste mes collisions :
for (int y = 0; y < 19; y++){
                        for (int x = 0; x < 25; x++){
                                _headboxRect=_rectangle[y][x].getGlobalBounds(); // _rectangle [y][x] correspond aux rectangles bleu sur l'image
                                if(_headboxPerso.intersects(_headboxRect))
                                {
                                        cout<<"collision"<<endl;
                                }
                        }
}
 

Je ne comprend pas pourquoi cela ne fonctionne pas, si vous pouviez juste m'indiquer une piste à explorer afin de ces intersections puisse fonctionner je vous remercie