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

Auteur Sujet: [Tutoriel, une tilemap] Faire une genre de tilemap mais avec plusieurs tilesets.  (Lu 5480 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Salut,
Les appels successif à Draw saccadent à mort l'affichage de mes animations surtout.
Cela fait longtemps que je cherche une méthode pour faire l'équivalent de ce que font les VertexArray ou encore les vertex buffer objects avec openGL mais en vain, la tilemap dans l'exemple de la SFML permet de faire la même chose mais avec un seul tilset hors moi, mes tiles sont répartie sur plusieurs tilesets différents.

Au sinon, je dois faire, une tile map par couche mais bon il se pourra surement que plus tard j'utilise plusieurs tileset par couche, je ne sais pas...
Il n'y a pas moyen de faire une genre de méthode bindTexture pour chaque quad du tableau de  vertex comme le fait openGL ?

PS : les rendertexture sont bien mais le problème c'est qu'il faut aussi faire plusieurs appel à draw et passé les états opengl à chaque fois ce qui rend le code source hyper lent!

Merci d'avance pour votre réponse.
« Modifié: Juin 29, 2013, 07:29:24 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Tu ne peux pas faire un vertex array par texture ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Si mes bon je trouve ça dommage de devoir faire comme ça, si je fais ça j'aurai autant d'appels à draw que ce que j'ai de tilesets, hors que je pourrai avoir que 3 appels à draw (un pour afficher les ombres, un pour afficher les tiles et un autre pour afficher les lumières.)

Bref je pense que je vais faire ça en attendant, une tilemap par couche, car j'ai fait un tileset par couche mais bon à l'avenir je pourrai plus faire ça parce que si il y a plusieurs tilesets de murs ou de bâtiments sur la même map par exemple je vais être embêté..., bref...
Ou alors je serai obligé de passé par opengl au pire.

Se serait bien de faire ça pour une amélioration futur de la SFML car je trouve ça dommage qu'on ne sait le faire qu'avec un seul tileset. :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Citer
je trouve ça dommage de devoir faire comme ça
Ca reste tout de même beaucoup plus efficace que d'avoir un appel à draw() par tile.

Citer
Se serait bien de faire ça pour une amélioration futur de la SFML car je trouve ça dommage qu'on ne sait le faire qu'avec un seul tileset
Je ne sais même pas si c'est possible avec OpenGL. La meilleure solution reste encore le shader.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Oui je viens de relire le tutoriels avec les vertexarray d'opengl et je ne sais pas si c'est possible, il n'en a pas parlé dans son tutoriel en tout cas, et moi même, je n'ai jamais essayé de le faire, bref, je vais faire une tilemap par tileset, car, je ne peux pas avoir des tilesets trop grand, je ne sais même plus quel est la taille maximum d'une texture que opengl peut gérer.
1024*1024 je pense mais pas sûr, ça pourrait être plus.

Bref..., j'ai déja toutes les infos dans ma classe tile (une genre de classe sprite mais que j'ai améliorée.)
Avec les textures rect donc + une classe ou je stocke les tilesets en mémoire ça va être facile je n'ai qu'à récupérer toutes ses infos et les coller dans la tilemap. (Ouf.)
« Modifié: Juin 29, 2013, 10:10:07 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Citer
1024*1024 je pense mais pas sûr, ça pourrait être plus.
1024x1024 est assez sûr (tu pourras trouver des cartes graphiques antiques bloquées sur 512x512, mais là franchement...).
Sinon les cartes graphiques actuelles peuvent monter jusqu'à 16384x16384.
Laurent Gomila - SFML developer

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Pour te donner une idée, mon PC vieux de plus de 7 ans supporte du 4096 * 4096. Alors bon 512 * 512 c'est quoi ? Des Voodoo ? :D
« Modifié: Juin 30, 2013, 01:20:09 am par G. »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Ok, c'est bon, je vais faire comme ça alors, une tilemap par tileset mais il faudra que je m'arrange pour que toutes les tiles sur mes tilesets appartiennent toujours à la même couche vu que je vais dessiner toutes les tiles de la même tileset d'un coup.

PS : j'ai quand même un système de sous couche dans la tilemap...
« Modifié: Juin 30, 2013, 09:02:29 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon bah en faisant comme ça c'est déja vachement plus rapide pour l'affichage contrairement à la SFML 1.6 ou l'on ne savait pas faire grand chose.  :-\

J'ai juste eu un peu de mal avec le positionnement des tiles et le placement de l'origine avec un subrect mais bon ça j'y suis arrivé. :)

J'ai du aussi modifier mon code pour que je récupère les paths des tilesets dans l'ordre avec lequel je dois afficher les tilesMap, parce que les std::map, contrairement aux vecteurs, ça ne garde pas l'ordre dans lequel on insère les éléments.
« Modifié: Juin 30, 2013, 02:00:07 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon ceci est très bien mais si j'ai par exemple un tileset avec des murs et un autre tileset avec des maisons, le problème c'est que les murs peuvent être soit devant ou derrière la maison, avec une tilemap, le problème c'est que, je suis toujours obligé de dessiner toute les tiles de la tilemap avant de dessiner toutes les tiles de l'autre tilemap et donc je n'ai pas d'autre choix que d'utiliser un tilemap par couche. (Donc les murs seront toujours derrière les maisons dans mon cas.)

Mais y a t'il moyen de faire en sorte que certaines tiles d'une tilemap soient affiché après ou bien avant certaines tiles d'une autre tilemap, car avant, j'affichais toute les tiles visibles à l'écran une par une avec une liste et je n'avais qu'à changer la place de la tile dans la liste si je voulais l'afficher avant ou après une autre tile, ici, avec les tilemap ça devient plus compliqué.
Se serait bien de rajouté une fonctionnalité qui défini l'ordre d'affichage des tiles de manière indépendante aux tilemap, je sais pas qu'est ce que t'en pense Laurent.

PS : j'ai le même problème avec les personnages et les monstres, ceux-ci doivent s'afficher devant ou derrière certaine tiles, ça dépend ou il se trouvent.
En 3D il n'y a pas de problème vu que il y a le zBuffer test mais en 2D je ne sais pas si c'est possible de faire ça avec une tilemap comme on le ferais en 3D avec un VertexArray et un zBuffer test. :/

Bref pourquoi ne pas pouvoir définir une sorte de zOrder par vertex de la SFML comme on le fait pour opengl  ?
Il y a ça dans pas mal d'api 2D.

PS 2 : sinon au pire je devrai utiliser un système sans tile map ou bien définir des coordonnées 3D pour mes tiles et passer par opengl qui lui fait un zbuffertest au niveau de la carte graphique.
« Modifié: Juillet 04, 2013, 10:52:18 am par Lolilolight »

 

anything