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

Auteur Sujet: Collison Tileset  (Lu 3008 fois)

0 Membres et 1 Invité sur ce sujet

Quentin-35

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Collison Tileset
« le: Janvier 02, 2015, 02:42:18 pm »
Bonjour à tous,
Je me présente je m'appelle Quentin.
J'ai commencé le codage C++ il y a maintenant 1 mois et 2 ou 3 semaine environs.  ;D

Afin de m'améliorer si on peut dire sa comme sa, j'ai commencé un jeux de plateforme en 2D.
Mon soucis est le suivant : J'ai utilisé le forum SFML pour l'utilisation d'un tileset sans soucis mais maintenant je cherche comment créer une collision avec certain tile par exemple le 2 et le 3.

Voila donc mon fameux soucis, je suis bloqué depuis 3 semaines dessus, je me suis même renseigné au prêt du créateur du cour de collision sur OpenClassroom, mais après plusieurs explications je suis toujours dans l'impasse étant donné qu'il la codé en SDL et moi je suis avec la SFML 2.1 (je ne suis pas encore passé à la 2.2) je vais faire sa prochainement.

Donc j'aimerais bien si possible que vous jetiez un oeil sur mon code (très peut simplifié et aussi pas très "propre"), si possible pouvez vous me montrer un code similaire avec un exemple de collision ou alors avec le miens en faire quelque chose, car je comprend mieux avec un exemple que je puisse modifier.

J'ai déjà cherché sur le FORUM mais chaque sujet parlant de collision avec un tileset son comment dire *flou*
Voilà pourquoi j'ai décidé de vous demander votre aide directement en créant un nouveau sujet voici mon code tel qu'il est actuellement :

main.cpp
(click to show/hide)

le vertex.cpp
(click to show/hide)

Variables.hpp
(click to show/hide)

si jamais ce n'est pas assez clair voici le .ZIP de mon projet : http://www.fichier-zip.com/2014/12/30/jeux-2d/

J'utilise Code::Blocks et la SFML 2.1
Je vous remercie d'avance de vos réponses et encore une fois bonne année 2015 à vous tous.   8)

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Collison Tileset
« Réponse #1 le: Janvier 02, 2015, 03:35:47 pm »
Citer
Donc j'aimerais bien si possible que vous jetiez un oeil sur mon code (très peut simplifié et aussi pas très "propre")

Si tu veux que quelqu'un regarde ton code, pense au moins à l'indenter...

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Collison Tileset
« Réponse #2 le: Janvier 02, 2015, 04:48:13 pm »
Y'a pas que l'indentation, c'est le truc le plus dégueulasse que j'ai vu cette année, pourtant je suis passé sur openclassrooms hier.
Y'a des évènements à peu près partout mais pas dans les boucles d'évènements. Plusieurs boucles while(window.isOpen()) c'est douteux. Un sf::Event::Closed tout seul. Des trucs après des break...
Franchement, la moindre des choses quand on demande de l'aide c'est de donner un truc lisible.

Si tu veux un conseil qui concerne ton problème, vu que tu débutes tu devrais essayer de créer des collisions dans un truc à part, pour ne pas être gêné par tout le code qui n'a rien à voir avec ta collision. Genre tu crées un programme tout bête de 50 lignes avec 2 rectangles et tu tentes de résoudre des collisions entre eux, puis t'essaies avec plus de 2 sprites, etc. une fois que ça fonctionne comme tu veux et que tu as bien compris ce que tu fais tu tentes d'intégrer ce système à ton jeu.
Ça sera plus facile à réaliser, ça sera plus facile de demander de l'aide, ça sera moins dégueulasse.

Pour aller au plus simple, tu voudras très certainement te servir de la fonction getGlobalBounds (des sprites ou des rectangles) pour récupérer le rectangle englobant (un sf::Rect) de tes sprites, puis de la fonction intersects qui permet de voir si 2 sf::Rect (les rectangles englobants des 2 sprites que tu veux tester entre eux) se superposent (= collision).
Etant donné que pour ta tilemap tu n'utilises pas de sprites tu vas devoir créer toi-même les rectangles englobants de tes tiles.
De même pour tester si un point (la souris) est à l'intérieur d'un rectangle (un bouton), tu peux récupérer le rectangle englobant de ton bouton (getGlobalBounds) et utiliser sa fonction contains. Ça sera plus simple que de faire ce que tu fais pour Jouer et Quitter.
Tu peux évidemment faire comme dans le tuto de FVirtman auquel tu fais référence, mais autant utiliser des fonctions qui existent déjà. ;)
« Modifié: Janvier 02, 2015, 04:49:51 pm par G. »

Quentin-35

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Collison Tileset
« Réponse #3 le: Janvier 02, 2015, 05:34:43 pm »
Salut merci de ta réponse, oui c'est pas propre comme code étant donné que à la base j'avais créer deux projet le jeux en question et le menu et apres j'ai mélangé les deux grosse erreur je vais réctifier sa merci, et merci du conseil je me lance dans la création des collisions avec un petit programme comme tu me la conseillé. :)

EDIT 2 :

Voici le code pour essayer les collisions (Il est mieux indenté ?) :p

(click to show/hide)
« Modifié: Janvier 02, 2015, 06:47:23 pm par Quentin-35 »

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Collison Tileset
« Réponse #4 le: Janvier 06, 2015, 01:25:52 am »
Ce que je peux te conseiller comme technique "basique" :

- Tu crées un tableau contenant des futures tiles qui vont faire des collisions (std::vector<sf::FloatRect>)
- Tu parcours tes tiles
- Pour chaque tile, tu testes si l'id de ta tile est une des id que comptée comme entraînant une collision
- Si elle l'est tu ajoutes un FloatRect dans ton tableau avec cette petite formule
tab.push_back(sf::FloatRect(xTile * tileSize.x, yTile * tileSize.y, tileSize.x, tileSize.y)); // xTile et yTile sont les variables pour parcourir ton tableau de tiles

- Ensuite pour chaque update :
- Tu regardes si la getGlobalBounds() de la sprite de ton perso intersects avec un des blocs
- Si oui :
- Tu calcules comment décaler ton perso
- Et tu le décales tant que tu es encore en collision avec le rectangle qui posait problème :)