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

Auteur Sujet: [Résolu]Tiles terrain isométrique  (Lu 3656 fois)

0 Membres et 1 Invité sur ce sujet

Ahoru

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
[Résolu]Tiles terrain isométrique
« le: Avril 25, 2013, 05:37:05 pm »
Bonjour :)

Je réalise un RPG en perspective isométrique et je suis partagé concernant la manière d'afficher le terrain, je viens donc solliciter votre aide.

Le jeu possède donc un terrain composé de plusieurs pavés qui possèdent 3 faces, étant donné l'angle de vue en 3D iso. Il est donc évident que l'affichage des tiles doit se faire dans un ordre précis sinon le terrain ne ressemble à rien. De plus, les maps du jeu seront très grandes (peut-être plus de 1000x1000), j'ai donc décidé de découper les données de chaque map en plusieurs fichiers de 100x100 contenant les infos du terrain ainsi que les objets, ainsi seuls les fichiers/parties nécessaires de la map seront chargées dynamiquement. Je précise également que le joueur doit être en permanence au centre de l'écran, c'est le décors qui se déplace et non lui.

Je me retrouve face à 2 solutions:
- À chaque frame je détermine les tiles a dessiner ainsi que leurs positions (je crée 1 sprite par texture différente puis je le déplace) en fonction de la position du joueur et de la taille de l'écran. Cependant je ne pense pas que ce soit la solution la plus "optimisée"...
- Lors du chargement d'une partie de la map je crée 1 sprite par tile et lui attribue une position qui restera inchangée, il ne me reste plus qu'à déplacer la sf::View et à déterminer les tiles qui doivent apparaitre à l'écran. Cependant il semblerait que lorsque la view est trop éloignée le terrain oscille, ce qui peut poser problème avec les grandes maps.
- J'ai également entendu parler des vertexbuffer mais je ne suis pas sûr que ce soit adapté pour cet usage.

D'après vous, quelle serait la meilleure solution dans mon cas ?

Cordialement,
« Modifié: Avril 29, 2013, 10:10:07 pm par Ahoru »

gostron

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : Tiles terrain isométrique
« Réponse #1 le: Avril 28, 2013, 12:23:27 pm »
Bonjour,

J'ai peur de pas avoir énormément d'expérience, mais j'ai eu l'occasion de m'amuser un peu avec la SFML pour des jeux vidéos.

Pour tous les éléments entièrement statiques je t'aurais conseillé de créer ton image une bonne fois pour toutes. En effet, il serait plus simple de générer ta carte comme il faut au début du jeu, de stocker l'image générée, puis de la ressortir au bon moment, après ça pose le problème de zoom/dézoom qui n'est pas géré et de la mémoire que tu dois gérer intelligemment.

Citer
Cependant il semblerait que lorsque la view est trop éloignée le terrain oscille, ce qui peut poser problème avec les grandes maps.
J'ai du mal à comprendre cette phrase.

Globalement, ce qu'il faut, c'est générer des listes de tiles en fonction de la position du joueur, c'est-à-dire que tu vas charger par exemple les neufs maps les plus proches du joueurs :
Où on a O la map où est le joueur puis les X les maps à charger en conséquence.
XXX
XOX
XXX
Encore une fois sans expérience particulière, j'aurais dit de charger ou décharger des cartes avec le déplacement du joueur, puis de jouer avec la view pour afficher les bonnes choses.
L'avantage de cette solution, c'est que les chargement et déchargements des cartes peuvent se faire sur des threads à part et empêche tout lag du jeu. Dans le pire des cas, tu arrives sur une carte qui n'est pas encore chargée (donc une sécurité à rajouter). Mais ça semble assez efficace comme système, j'ai du mal à imaginer une quelconque avarie de processeur ou de mémoire.

Ahoru

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Tiles terrain isométrique
« Réponse #2 le: Avril 28, 2013, 08:08:42 pm »
Le système de chargement  des parties de la map en fonction de la position du joueur est déjà implanté :)

En fait concernant la phrase que tu n'as pas compris, lorsque la position de la view est très éloignée (du genre 1000000 en X et 1000000 en Y), le rendu dans la fenêtre "vibre".
Cependant même si je prévois de faire de grandes maps je doute arriver à de telles valeurs donc ce n'est plus un problème.

Je suis débutant avec la SFML, pourrais-tu me dire comment faire pour rendre/stocker plusieurs sprites dans une image ? Mais si je comprends bien ton idée cela signifie que par exemple si le joueur se trouve à moitié derrière une tile, il sera quand même rendu en intégralité par dessus =/

En tout cas merci pour ta réponse :)
« Modifié: Avril 28, 2013, 08:10:30 pm par Ahoru »

gostron

  • Jr. Member
  • **
  • Messages: 53
    • Voir le profil
Re : Tiles terrain isométrique
« Réponse #3 le: Avril 28, 2013, 08:27:35 pm »
Pour répondre à ta question, j'utilise souvent mes propres objets pour dessiner dans un jeu, et ces objets sont directement dessinables via plusieurs moyens différents.
On peut par exemple hériter de sf::Drawable, et réimplémenter la fonction draw() pour alors afficher tous les sprites que l'on contient.
On peut aussi juste contenir une liste de sprite, et implémenter une méthode qui prend en argument la cible d'affichage (RenderWindow par exemple) et qui va boucler pour afficher tous les sprites que l'objet contient.

Je ne sais pas quelle méthode est la plus propre ou la plus agréable, mais j'ai déjà utilisé les deux.

Concernant les soucis de devant/derrière, j'ai une petite idée qui vaudrait peut-être le coup d'être essayé.

Imaginons notre héros sur une minimap, et le souci est de l'afficher au bon moment pour être derrière notre arbre, mais devant la pierre et le sol. Il suffit donc d'affiche notre minimap, mais d'afficher le héro au bon moment (puisque le problème interne à la minimap ne se pose pas si tu l'as créée correctement).
On pourrait donc essayer par exemple de donnée les éléments qui bougent et les éléments qui ne bougent pas, puis de parcourir les éléments qui ne bougent pas, et quand on arrive aux bonnes ordonnées (le y du héro est entre les deux objets non bougeants), alors on affiche le héros, puis on continue le parcours de notre liste.

On peut généraliser cette méthode à plusieurs object bougeant, en triant d'abord la liste des bougeant (ou juste en swappant les éléments qui ont bougé d'ordre d'une image à l'autre, si on veut optimiser), puis on parcours les immobiles en insérant les mobiles au bon moment.

Ahoru

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
    • E-mail
Re : Tiles terrain isométrique
« Réponse #4 le: Avril 29, 2013, 10:09:41 pm »
Merci pour tous tes conseils = :)
Le nouveau tutoriel de Laurent sur les VertexArray a largement répondu à ma question sur la manière d'afficher mes tiles, merci 1000 fois  ;)