Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Jamese le Août 31, 2014, 01:45:04 pm

Titre: collision tilemaping
Posté par: Jamese le Août 31, 2014, 01:45:04 pm
Bonjour depuis plusieurs semaines j'ai commencer à créer un petit jeux à la Zelda ( on a tous essayer dite pas le contraire ), vous me dirais pourquoi autant de temps mais bon entre les graphismes, l’histoire et j'en passe sa en fait des choses. Et en ce moment je commence a coder le jeux. Mais voila que je me heurt à un petit problème, j'arrive très bien a faire un tilemap mais la ou je "bloque" c'est pour gérer les collisions. J'ai trouver plusieurs méthode, mais soit je n'arrive pas à les adapter, soit elle ne fonctionne pas. J'ai donc ouvert ce post pour que vous puissiez m'aider ou me donner quelque astuce que vous auriez pu utiliser.

   => j'ai essayer le tuto de fred sur open mais je n'ai pas réussi, et pour mon tilemaping j'utilise la méthode de Laurent qui pour moi est la plus simple.


Merci a vous et de vos réponses. Je vous souhaite une bonne journée 
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Août 31, 2014, 09:46:30 pm
Salut à toi!

"Un jeu à la zelda"... Tu sais des zelda il y en a eu en 2D, en 3D, un mix des 2, donc on ne peut pas savoir de quel type de jeu tu parles. Si c'est un jeu de type pokemon:

Déjà, tu vas devoir gérer les déplacements de ton personnage de façon à qu'il ne pourra s'arrêter que lorsqu'il sera au beau milieu d'une case de ton jeu. Ensuite, dès qu'il voudra se déplacer tu devras:

1. A l'aide d"une petite algo, trouver sur quelle case il sera après ce déplacement. (En fonction de sa position à l'écran.)
2. Si cette case est une case ou il à le droit de se déplacer, alors tu autorises. Autrement, tu n'autorises pas.

Et voilà! C'est aussi simple que ça. C'est d'ailleurs la technique que pokemon utilise. Je parle pour le mode de déplacement non libre.

Bonnes fin de vacances.
Titre: Re : collision tilemaping
Posté par: Jamese le Août 31, 2014, 10:01:54 pm
ok ok merci bien, je vais essayer sa demain. Je vous tien au courant 
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 11:03:59 am
Bonmatin.
Pour faire mes collisions javais penssais à faire un tableau de bool comme celui la :
 {
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,
    };
qui représenterais ma map et ou les 1 serais les murs et les 0 le vide ( on passe ).
Ce tableau représenterais la map. mais après c'est la où mon "algo" rentre en jeux :
=> récupérais la pos de mon joueur
=> restreindre le test de tiles a 2 ou 3 autour de luis
=> voir si c'est tiles sont un 0 ou un 1.

le pensez-vous pertinent ou il faut que je l’améliore.
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 11:56:25 am
Hum... J'ai rien compris... Quel est ton problème?
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 12:02:36 pm
non c'étais pour te montrer mon algo  :) . apres je l'ai pas encore mis en forme je vais essayer cette aprem on va bien voir si il marche.
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 12:09:58 pm
Oui mais justement avec toutes les fautes d'orthographe et aucune ponctuation je n'ai pas compris. Réexplique moi et je te dirais si c'est ça ;)
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 01:01:04 pm
j'ai écrit sa vite fait ce matin la tête dans les chaussettes. Enfin bref voici mon idée :

Dans une fonction booléen :

on récupère la position de mon joueur.
Puis on restreins le test des tuiles à tester de 1 ou 2 autour de mon joueur ( double for )
On vérifie les tuiles soit 1 ou 0 ( avec un If )
Et de la on retourne true si il y a collision ( en occurrence si c'est une tuile "1" ) sinon on retourne false 

Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 01:02:53 pm
Oui c'est à peu près ça: la ligne 2 n'est toujours pas très explicite mais je suppose que tu veux tester la case juste devant le joueur (ou derrière tout dépend du déplacement voulu). Si c'est ça, tu peux commencer à coder!
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 01:20:55 pm
c'est exactement sa.
Merci je vais coder je te tien au jus  :)
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 01:41:09 pm
ça marche
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 02:07:00 pm
^^ tu va peut être rire mais je ne me rappel plus comment on déclare un tableau de bool
J'ai fait sa mais le compilo me jette
bool map_collision [] =
    {
        1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,
    };
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 02:27:36 pm
C'est bien comme ça.
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 02:38:47 pm
ok je pige plus rien sa viens de marcher j'ai rien toucher vive les mystère ...

Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 04:05:22 pm
Bon voici ou j'en suis :

jame.h
(click to show/hide)

Jame.cpp (  c'est mon personnage )
(click to show/hide)

bon sa ma l'aire* bien mais le compilo me dit qu'il y a une erreur :
 Sur la ligne du 1er for ainssi que du 2eme il me dit : "ERROR : expectef ';' befor ')' token"
c'est quoi ce truc qu'il manque
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 04:43:49 pm
C'est parce que tu as oublié d'initialiser hauteur 1:
for (hauteur_1 < hauteur_2; ++hauteur_1)
deviendra
for (int hauteur_1 = 0; hauteur_1< hauteur_2; ++hauteur_1)
Et ainsi que pour la prochaine.
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 04:53:22 pm
ok merci, par contre la ou je sait pas quoi faire c'est comment test si c'est une tiles 1 ou 0 ( dans mon tableau de bool )
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 07:00:47 pm
Une petite algo simple:

int persoIndexX = perso.getPosition().x+moitiéLargeurPerso / largeurTile;
int persoIndexY = perso.getPosition().y+hauteurPerso / hauteurTile;


Par contre tu devras vérifier que ton perso ne sorte pas de l'écran sinon ça va crasher.
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 07:02:49 pm
ok un grand merci je vais faire sa.

Et dsl mais j'arrive pas a trouver une solution a ton problème ( pour l’isométrique )
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 07:05:41 pm
Derien bah pas grave règle les tiens d'abord ;)
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 07:33:03 pm
ok, par contre je ne voie pas comment on va s'avoir si c'est 1 ou 0 avec ton algo =).

Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 07:35:55 pm
Là c'est que tu n'as pas compris... Tu recopies ce que je te dis sans rien comprendre ;) L'algorithme que je t'ai montrée désigne l'index pour ton tableau. Maintenant tu regardes ce qu'il y a dans ton tableau à cette index du style m_collisions[indexX] [indexY]...
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 07:43:07 pm
genre un truc comme sa :
if ( map_collision [ int (x/taillecase) + 3*int(y/taillecase) ] ==1 )
{
       return true;
}
 
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 08:21:52 pm
Si 3 représente la largeur de ta map ça va, autrement tu n'as pas compris que tu travailles sur un tableau 1d. Mais tu dois accéder à ses éléments sur 2 dimensions ce qui signifie qu'il te faut une formule pour le prendre en compte comme un tableau 2d et accéder à ses éléments. Ouh on l'a finie!  ;D La formule est celle ci:

Si tu voudrais accéder à l'élément[0][2] d'un tableau 2D tu ferais (mais c'est mal les tableaux 2D):
m_tableau[0][2];
Dans ton cas tu dois faire:
m_tableau[0*nombreColonnes + 2];

Voilà :)

PS: essaie de comprendre la mini-algo c'est important
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 08:53:51 pm
ok je regarde un peut la télé et je regarde sa tout a l'heure, merci pour ton aide
Titre: Re : collision tilemaping
Posté par: AnselmeSfml le Septembre 01, 2014, 08:58:43 pm
Derien bonne télé  8)
Titre: Re : collision tilemaping
Posté par: Jamese le Septembre 01, 2014, 11:00:07 pm
Suite a un bon film ( je ne vous dirais pas lequel ) ma logique à étais si logique que je pense avoir trouver un truc. Je me suis donc mis a coder  ::). Et j'en ai sortie cette condition :

for (int hauteur_1 = posX -80; hauteur_1 < hauteur_2; ++hauteur_1)
            for (int largeur_1 = posY -80; largeur_1 < largeur_2; ++largeur_1)
            {
                if (map_collision [tiles + 3* tiles2] == 1)
                {
                    return true;
                }
                return false;
            }
 

Mais bon je suis quasi sur qu'il va manquer un petit truc.
Titre: Re : collision tilemaping
Posté par: TheKingArthur le Septembre 02, 2014, 06:34:53 pm
Je pense que c'est bon. Mais test quand même. :)