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

Auteur Sujet: Isométrique & gestion d'objets de map (entités)  (Lu 3294 fois)

0 Membres et 1 Invité sur ce sujet

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Isométrique & gestion d'objets de map (entités)
« le: Février 05, 2015, 04:52:49 pm »
Bonjour à tous!  :)

Comme certains le savent peut-être, je travaille depuis 5 mois sur la conception d'un simple moteur isométrique, et beaucoup de fonctionnalités sont déjà prêtes, vous pouvez y jeter un oeil ici:  ;) https://github.com/AnselmeClergeot/Fiso-Engine

J'ai commencé à développer la dernière fonctionnalité primordiale: la gestion d'entités (des objets du monde à cacher derrière les tuiles situées devant eux).

La carte peut être composée de plusieurs étages, chacune étant composée du même nombre de sf::VertexArray (chunks).

Sachant que mes cartes sont composés de sf::VertexArray, il m'est impossible de dessiner directement entre deux tuiles l'objet en question (étant un sf::Sprite). J'ai réfléchis à une méthode : chaque objet redessine les 3 tuiles étant devant lui par-dessus les tuiles d'origine. Ainsi, il se retrouve caché derrière les tuiles qui sont sensés le cacher...

Seulement, cette solution à un gros inconvénient puisque les tuiles redessinées pour cacher l'objet devraient logiquement être cachés derrière les tuiles plus proches... Or ce n'est pas le cas puisque les tuiles de "cachement" sont redessinées par dessus toutes les autres tuiles et se retrouvent ainsi devant les plus proches... Vous avez compris le problème que cela pose?  :-\

Je fais donc appel à la communauté pour savoir quels techniques je pourrait utiliser pour gérer cette fonctionnalité, ou comment palier le problème en question, bien que j'ai comme l'impression que ma méthode sois un peu "ingérable"  :P

Merci d'avance!  ;)
« Modifié: Février 05, 2015, 04:58:51 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #1 le: Février 05, 2015, 05:00:46 pm »
A froid, le truc le plus simple auquel je puisse penser c'est d'afficher ton vertex array ligne par ligne. Ce qui te permet d'intercaler des entités entre deux lignes (a priori une même ligne aura une seule profondeur non ?), tout en gardant un nombre relativement faible d'appels à draw().

Sinon il faut aller dans des trucs plus compliqués, avec gestion (hard ou soft) d'une composante Z pour chaque entité, y compris les tuiles du niveau.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #2 le: Février 05, 2015, 05:11:25 pm »
Merci de ta réponse rapide Laurent,  :)

Afficher le vertexArray ligne par ligne est une bonne idée, mais il resterait également à cacher l'objet derrière la tuile située à "notre" droite... Tu comprends ?  :-\

Peux-tu m'en dire un peu plus sur la méthode hard? Histoire que ça m'ouvre un peu l'esprit ;)

Merci encore.
« Modifié: Février 05, 2015, 05:17:41 pm par AnselmeSfml »

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #3 le: Février 05, 2015, 07:16:09 pm »
Pour dessiner le vertexArray ligne par ligne, tu parles en fait de créer des chunks en ligne, de 1 tuile de large?
Ou existe-t-il un moyen de dessiner que certaines parties du vertexArray?

Merci.  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #4 le: Février 05, 2015, 08:36:18 pm »
Citer
Afficher le vertexArray ligne par ligne est une bonne idée, mais il resterait également à cacher l'objet derrière la tuile située à "notre" droite... Tu comprends ?
Oui je vois, effectivement la tuile de droite pose problème avec cette méthode.

Citer
Peux-tu m'en dire un peu plus sur la méthode hard? Histoire que ça m'ouvre un peu l'esprit
Il s'agit de gérer de la 3D, et de profiter du depth buffer d'OpenGL pour trier les primitives selon leur profondeur. Mais là on est bien entendu largement en dehors des clous de SFML :)

Citer
Pour dessiner le vertexArray ligne par ligne, tu parles en fait de créer des chunks en ligne, de 1 tuile de large?
Ou existe-t-il un moyen de dessiner que certaines parties du vertexArray?
Tu peux dessiner n'importe quelle sous-partie d'un tableau de vertex, pourvue qu'elle soit contigüe en mémoire, avec la fonction draw() qui prend un const sf::Vertex* + une taille.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #5 le: Février 05, 2015, 08:44:08 pm »
Merci de ta réponse.
Pour la 3D on rentre dans quelque chose de trop compliqué pour ce que j'essaie de réaliser... En revanche je vais me pencher sur le dessin de chunks de manière linéaire, et je me débrouillerai bien pour la tuile de droite. Mais si j'ai une grande carte, ça fera beaucoup d'appel à draw(), non?
« Modifié: Février 05, 2015, 08:45:52 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #6 le: Février 05, 2015, 08:50:24 pm »
Avec cette méthode, l'avantage c'est que tu peux très facilement ne dessiner que les tuiles visibles à l'écran. Du coup quelque soit la taille de la carte, tu auras toujours le même nombre d'appels à draw() (genre une vingtaine -- largement gérable pour ta carte graphique).
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #7 le: Février 06, 2015, 05:19:36 pm »
Merci encore.  :)

Donc si j'ai bien compris, je n'ai pas besoin de m'embêter avec plusieurs chunks par couche: un sf::VertexArray par couche suffira puisque je ne dessinerai que les vertex de celui-ci visibles à l'écran. C'est bien ça?
Concernant cette fonction:

void draw (const Vertex *vertices, unsigned int vertexCount, PrimitiveType type, const RenderStates &states=RenderStates::Default)

vertexCount est le nombre de vertex qui suivent *vertices dans le tableau à prendre en compte... C'est bien ça?

Mais au fait, je peux donc grâce à cette méthode dessiner un sf::Sprite entre 4 vertex! Avec une petite algo qui déterminerai à quelle tuile appartient tel ou tel vertex! Ce serait ainsi encore plus simple! Où peut-être m'égarerais-je ?  :-\

Merci encore Laurent.
« Modifié: Février 06, 2015, 05:23:05 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #8 le: Février 06, 2015, 07:06:57 pm »
Citer
vertexCount est le nombre de vertex qui suivent *vertices dans le tableau à prendre en compte... C'est bien ça?
Oui.

Citer
Mais au fait, je peux donc grâce à cette méthode dessiner un sf::Sprite entre 4 vertex! Avec une petite algo qui déterminerai à quelle tuile appartient tel ou tel vertex! Ce serait ainsi encore plus simple! Où peut-être m'égarerais-je ?
Je ne suis pas sûr de comprendre ce que tu voudrais faire, ni en quoi ça pourrait être "plus simple". Peux-tu développer ?
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #9 le: Février 06, 2015, 07:18:21 pm »
Partant du principe qu'on peux dessiner quand on veux la partie du vertexArray qu'on veux, je pourrais (pour faire court) dessiner (d'un coup) les vertex ne cachant pas mon sprite, mon sprite, et ensuite les vertex le cachant... (Ce à l'aide d'une petite algo de rien du tout).

En gros, cette technique + culling des vertex invisibles à l'écran = plus besoin de plusieurs vertexArray par couches, si?
« Modifié: Février 06, 2015, 08:01:02 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #10 le: Février 06, 2015, 08:19:08 pm »
Oui en effet, comme ça tu n'aurais que 3 appels à draw(), mais... tu n'as toujours qu'un seul sprite en plus du niveau ?? Parce qu'avec plusieurs dizaines de sprites ça commence à devenir compliqué (quoique...).
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #11 le: Février 06, 2015, 08:57:42 pm »
Bien sûr, comme tu as dis, plusieurs objets pourront faire partie du monde, mais je ne craint pas une éventuelle baisse de perfos avec cette méthode. Je vais donc tester cette technique premièrement, et si je me rend compte que c'est finalement trop vorace en CPU, je ferais la technique du dessin du vertexArray par lignes et me débrouillerait pour la "tuile de droite".

En tout cas merci énormément de ton aide, grâce à toi je vais pouvoir continuer le développement de mon chouchou.  8)  ;D

Dernière petite question :  ::)
Le dessin d'un gros vertexArray peut-il s'avérer plus vorace que le dessin de plein petits éléments?  Ou ce qui compte c'est juste d'avoir le nombre d'appel à draw() le plus faible possible?

Encore merci pour tout.  ;)
« Modifié: Février 06, 2015, 09:00:29 pm par AnselmeSfml »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #12 le: Février 06, 2015, 10:26:59 pm »
En gros, le nombre d'appels à draw() est un bon cran au-dessus de tout le reste. Si tu ne dois avoir qu'une seule préoccupation, ça doit être ça.

Mais bon évidemment chaque configuration est différente, donc n'hésite pas à faire des tests quoiqu'il arrive.
Laurent Gomila - SFML developer

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Isométrique & gestion d'objets de map (entités)
« Réponse #13 le: Février 07, 2015, 02:45:13 pm »
D'accord, je m'en souviendrais.

Merci encore pour tout.