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

Auteur Sujet: Collision Tilemap  (Lu 29401 fois)

0 Membres et 1 Invité sur ce sujet

maxia

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Collision Tilemap
« le: Mai 06, 2014, 07:05:11 pm »
Salutation,

Je viens de crée une map en utilisant le tilemapping proposé dans le tutoriel sur le site, mais maintenant, je ne sais pas comment géré les collisions .

Merci d'avance,
Cordialement,

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #1 le: Mai 06, 2014, 11:57:51 pm »
Je te suggère d'utiliser un tableau de booléens de dimensions identiques au tableau que tu utilises pour ton tileMapping. Ainsi pour chaque case de ton tileMap, tu associes la valeur 0 ou 1 selon que la case correspondante est un obstacle ou non.
Tu n as alors plus qu'à implémenter une fonction booléenne qui prend en paramètres des coordonnées(x;y) et ton tableau de booléens et qui renvoie true ou false selon que les coordonnées correspondent à un obstacle ou non.
Par exemple :
int tileMap [] = {
0,1,0,
1,2,2,
1,0,2 }
 
bool masque [] = {
0,1,0,
1,1,1,
1,0,1 }

bool collision(bool masque[], int x, int y, int tailleCase)
{
      if( masque[ int(x/tailleCase) + 3*int(y/tailleCase) ] == 1)
             return true;
      return false;  
 }        
 
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

maxia

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Collision Tilemap
« Réponse #2 le: Mai 07, 2014, 09:32:32 pm »
Merci PtichapronRouge, mais comme mon jeu est plateformé (comme mario) et donc mon personnage ne se déplace que sur 1 axe (x) j'ai modifié ta fonction et voici ce que j'ai fait:

bool collision(bool masque[], int x, int tailleCase)
{
     
      if( masque[(x/tailleCase)] == 1)
      {
             return true;
      }
      else
      {
              return false;
      }

 }
Pourtant sa marche plus alors que ton code marchais parfaitement et je ne comprends pas pourquoi .
Merci d'avance,
« Modifié: Mai 07, 2014, 10:54:36 pm par maxia »

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #3 le: Mai 08, 2014, 12:54:33 am »
Si c est un jeu de plateforme style Mario, tu as quand même besoin des ordonnées, sinon ça veut dire que ton jeu entier est une unique ligne, pas sur que ce soit ce que tu cherches :D
Ayant déjà code un jeu "style Mario", je te garantis que tu as besoin des x comme des y ^^ (ne serait-ce que pour empêcher le personnage de passer à travers le sol)

En fait tu dis que ton personnage ne se déplace qu en x, donc il ne saute jamais ? ^^
« Modifié: Mai 08, 2014, 12:57:01 am par PtichapronRouge »
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

maxia

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Collision Tilemap
« Réponse #4 le: Mai 08, 2014, 08:12:18 pm »
Tu a tous à fait raison .
Mais pourquoi tu multiplie y pas 3 ?

Merci d'avance,

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #5 le: Mai 08, 2014, 08:59:47 pm »
Parce que j utilise un tableau à une dimension alors que ton monde est en 2D ^^
Il faut donc convertir des coordonnées 2D en coordonnées 1D :)
Regarde : le case (0;0) de ton monde correspond à la case 0 du tableau. La case (2;0) du monde a la case 2 du tableau. Mais la case (2;2) ? Sûrement pas à la case 4 car sinon il y aurait conflit avec la case (4;0)  ^^
En fait, si ton tableau a N colonnes, la case (x;y) du monde correspondra à la case x + N*y du tableau :)
Du coup, si tu as un monde de dimension (n;p), ton tableau sera de dimension n*p :)
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #6 le: Mai 08, 2014, 09:08:30 pm »
D ailleurs je regarde le code que tu as posté, et tu écris :
if ( masque[x/tailleCase] == 1)
 
Du coup si x/tailleCase vaut 2,3 par exemple, tu demandes à ton tableau de renvoyer le valeur de la case numéro 2,3 et je suis pas sur qu il apprécie ^^
Prend plutôt la partie entière en écrivant :
if(masque[int(x/tailleCase)] == 1)
 
Ça me paraît plus sur ;)
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

maxia

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Collision Tilemap
« Réponse #7 le: Mai 08, 2014, 09:29:07 pm »
D'accord, s'il te plaît une des dernières question tailleCase c'est la taille d'une case ? je veux dire la taille x ou y ?

Merci d'avance,

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #8 le: Mai 08, 2014, 10:53:31 pm »
J ai considéré que tu utilisais des tiles carrées, donc tailleCase est le côté d une tile en pixels (généralement 32 ou 64 pixels). Mais tu peux aussi faire ton tileMap avec de rectangles, et je te conseille alors d utiliser un vector2u qui contiendra la hauteur et la largeur d une tile :)
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?

maxia

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Collision Tilemap
« Réponse #9 le: Mai 09, 2014, 07:54:20 pm »
Cool merci pour tous :) !

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #10 le: Mai 09, 2014, 07:57:13 pm »
de rien :)
met le thread en résolu si possible ;)
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 #11 le: Mai 10, 2014, 04:50:09 pm »
Salut, moi le problème vient plus loin, j'arrive "détecté" la collision, Mai
quelle ligne de code utiliser pour que le personnage soie "bloquer"
j'ai réussis a "bloqué" les côtés pour que mon perso ne sors pas la fênetre

Comment faire pour que la détection détecte pas toutes une ligne(ex/ y:456 puis être bloqué)
Par exemple un carre de 100 pixeles(en guise de mur) au milieu du graphique et que le personnage ne puisse pas les traverser..

Il faudrait mettre des "<" et aussi ">" ? ??? mettre un  A entre B <0 - 100>?
y'a t'il une ligne de code présice pour cela?  ???
 
Comment faire S.V.P
« Modifié: Mai 10, 2014, 04:53:45 pm par spyker18 »

PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #12 le: Mai 10, 2014, 05:58:43 pm »
Cette fois j ai du mal à comprendre le problème ^^
Qu' est ce que A et B ? Que veut tu dire par
Comment faire pour que la détection détecte pas toutes une ligne(ex/ y:456 puis être bloqué)
?

Ensuite :
quelle ligne de code utiliser pour que le personnage soie "bloquer" ?

On ne gère pas les collisions avec une seule ligne de code, les collisions sont souvent gérées par d assez gros calculs mathématiques, tu peux lire ce tuto si ça t intéresse : http://fr.openclassrooms.com/informatique/cours/theorie-des-collisions
Enfin je ne pense pas que tu en aies besoin pour ça, mais si tu veux de l aide je vais avoir besoin de renseignements un peu plus précis :D
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 #13 le: Mai 10, 2014, 07:02:49 pm »
Salut oui,
wala mes lignes :

Citer
if ((sprite_perso.getPosition().x >= 375) &&
(sprite_perso.getPosition().x <= 450))
{
    if (sprite_perso.getPosition().x >= 375)
        {
            sprite_perso.setPosition(sf::Vector2f(375, sprite_perso.getPosition().y));
        }
    if (sprite_perso.getPosition().x >= 430)
        {
            sprite_perso.setPosition(sf::Vector2f(430, sprite_perso.getPosition().y));
        }
}

Elles marchent, mais.. séparément, comme tu le vois  le premier côte marche mais le deuxième non, vuc le premier est aussi plus grand que 375
donc je vais dans le mauvais chemain...

pour la documentation que tu ma passer je l'ai deja vue, mais je n'ai peu être pas passer ou il m'était pour "bloqué" le personnage...


PtichapronRouge

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Collision Tilemap
« Réponse #14 le: Mai 10, 2014, 07:30:05 pm »
J'ai un peu de mal à comprendre ce que ce code est censé faire  :o certains tests sont complètement inutiles ^^'
par exemple ligne 1 tu testes si la position set supérieure a 375
if ((sprite_perso.getPosition().x >= 375) && (sprite_perso.getPosition().x <= 450))
puis si cette condition est vérifiée, tu retestes si la position est supérieure à 375 :
 if (sprite_perso.getPosition().x >= 375)
Ca ne sert à rien, autant enlever la condition de départ :
if (sprite_perso.getPosition().x >= 375)
{
     sprite_perso.setPosition(sf::Vector2f(375, sprite_perso.getPosition().y));
 }
 if (sprite_perso.getPosition().x >= 430)
 {
      sprite_perso.setPosition(sf::Vector2f(430, sprite_perso.getPosition().y));
 }
Mais même comme ça je ne vois pas ce que tu veux faire, que représentent les valeurs 450 et 375 (et 430 qui apparaît aussi, mais c est peut être une faute de frappe) ?
Essaie d'expliquer le plus clairement possible et en quelques lignes ce que tu veux faire exactement :)

PS :
comme tu le vois
Hmm je vois pas grand chose non :p
« Modifié: Mai 10, 2014, 07:32:30 pm par PtichapronRouge »
Un coca, un ordinateur, et un livre SFML Game Development. Elle est pas belle la vie ?