Tilegame : première étape
Par -Alexandre LEGOUT aka LAlex- le mercredi, novembre 19 2003, 11:54 - Projets - Lien permanent
Voici une toute première étape de mon moteur de tilegame ...
Il s'agit donc pour l'instant d'un affichage en 2D avec vue du dessus. Je compte en fait finaliser le moteur de cette manière avant de faire un affichage en 3D iso.
En effet, de par sa programmation en MVC, la vue (l'affichage) se contente de réagir aux évenements du model (les données). Le plus gros du travail consiste donc a structurer correctement le modele pour qu'il stocke les données de manière optimale, et de lui faire envoyer les bons évenements. La partie affichage ne devient en fait qu'un "détail" ... ![]()
Pour ce qui est du stockage des données, étant donné que j'ai trouvé peu de ressources sur la programmation d'un tel moteur en POO (beaucoup d'exemples en C, mais c'est pas vraiment pareil), je suis donc parti de rien. Juste le fait de savoir qu'il faut que la carte ai plusieurs niveaux, dans l'optique de la 3D iso.
Le modele contient donc un tableau des différentes couches, qui sont elle-mêmes des tableaux à deux dimensions contenant uniquement des nombres. Pour l'instant je n'ai que deux couches : la couche du sol (les cases blanches), et la couche du décor (les murs, symbolisés par les cases noires).
Le modèle contient également un tableau "d'éléments". Je nomme élément tout ce qui peut recevoir le focus durant un jeu. Certains pouront se déplacer (héro, NPC, etc..), et d'autres non. Une classe Element leur est dédiée. Chaque élément est situé sur une couche de la carte.
Comme il faut le faire en MVC, le contrôleur est la classe qui va spécifier au modèle les actions à effectuer. C'est donc cette classe qui se charge également d'écouter le clavier (pour l'instant, ensuite les déplacements pouront se faire à la souris).
Lors d'une instruction de déplacement d'un élément recue du contrôleur, le modèle vérifie si cet élément peut se déplacer sur la case de destination, et applique ces modifications si c'est le cas. Ensuite, il emet un évenement qui va être reçu par la vue, qui va déplacer le clip correspondant.
Le chargement des données se fait bien évidemment via un fichier XML qui contiendra toutes les infos. Je pense aussi rajouter une balise <?xml encoding="UTF-8"?>
<map width="10" height="10">
<layers>
<layer depth="0">
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
</layer>
<layer depth="1">
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,10, 0, 0, 0, 0, 0, 0, 0, 0,
0,10, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,10, 0, 0, 0, 0, 0, 0,
0, 0, 0,10, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
</layer>
</layers>
<elements>
<element type="CHARACTER" layer="1" focus="true">LAlex</element>
</elements>
</map>
En fait, ce moyen de programmer est assez excellent !
Je le mets en pratique "à ma manière", étant donné que je n'ai pas vraiment de référence la dessus, mais j'essaie d'appliquer le concept de la manière dont je le comprends, et je trouve ca passionant ! ![]()
Commentaires
Ca vaudrait le coup que les couches très peu remplies soient codées différemment.
Par exemple avec des triplets (x,y, type) :
1,1,10, 1,2,10, 3,3,10, 3,4,10
J'y ai pensé ... mais l'idée était d'avoir une idée de ce que donne la carte en voyant le fichier XML ... ce qui plus délicat avec la solution que tu préconises ... 8|
Mais pourquoi pas, une fois que j'aurai fait un éditeur, qui ne nécessitera plus de "voir" la carte dans le fichier ...
un éditeur simple : Excel
Et ouais, ca exporte du xml
J'ai fait un truc du genre il y a peu, si ça peut t'aider, j'upload les fichiers. Je colle l'adresse dès que c'est fait.
neo >> J'ai peur qu'on puisse difficilement configurer suffisamment Excel pour qu'il me sorte des fichiers formatés comme je le veux ... 8| Je pensais plus à faire un éditeur en Flash ...
Tynril >> Merci !
Yop,
Je trouve que tu néglige quelque peu l'importance de l'affichage("La partie affichage ne devient en fait qu'un "détail"").
Théoriquement, un moteur 2D devrait facilement être portable en 3D iso.. mais c loin d'être le cas, surtout avec les limitations de flash.
Si la portabilité se limitait à la conversion des coordonnées 2D en 3D iso, ce serait tres simple, mais il faut prendre en compte pas mal d'autres données, telles que la façon dont tu vas gerer ton pathfinding entre les differentes depths, la façon dont tu vas gerer le z-sorting... et surtout, la façon dont tu vas afficher l'ensemble en fausse 3D...
Pour ma part qd j'avais fais mes recherches j'etais partis du principe :
1 couche sol
1 couche decor
1 couche action
1 couche hauteur
Cela paraissait suffisant sur papier et j'avais démarré mon moteur de cette maniere la.. mais en cours de route, et surtout une fois passé en 3D iso, on pense à des hauteurs devant permettre au user de passer en dessous (pont), on pense à des gros objets prenant differentes tiles en largeur et en longueur.. sans parler des 8 directions de mouvement qui lors d'un rendu 3D et meme 2D peut te faire prendre conscience de certaines problematique d'affichage (d'ou mon test de wall avoiding que vous retrouver dans ma compilation de test : http://www.polykrom.com/isotest/)
bref.. ne néglige pas ta reflexion sur le rendu final, car il peut s'averer tres important des le départ.
Wala !
Alors, le résultat déjà :
http://tynril.free.fr/tilegame/
Ensuite le XML du monde utilisé :
http://tynril.free.fr/worlds/testworld.xml
Et finalement un pack avec les sources :
http://tynril.free.fr/tilegame/tilegame.zip
C'est le gros bordel vu que c'est en développement, mais bon, ça peut donner des idées
Polykrom >> Bon, j'y suis peut-être allé un peu fort en parlant de détail ...
J'ai déjà pensé à quelques unes des problèmatiques que tu évoques. Par exemple, la facon de gérer le z-sorting est purement une fonctionnalité de le vue, et pas du modèle ... Pareil pour les différentes depth. La gestion du PathFinding se fait de la même manière pour de la 2D et de la 3D iso.
Pour ce qui est de la gestion des hauteurs, c'est vrai que le problême est spécifique à la 3D iso, c'est peut-être le seul je pense ... mais si tu peux me faire part des problêmes propres à la 3D iso que tu as rencontrés au niveau du traitement des données, je serais ravi de profiter de ton expérience !!!
Mais je pense qu'avec un modèle suffisemment générique, il peut être exactement le même pour de la 2D et de la 3D iso ...
Pareil pour le controleur d'ailleurs ... 
Tynril >> Cool !
Le pathfinding, c'est du A* ? Je vais regarder tes sources avec interêt !!! 
Le pathfinder c'est une version AS2 de l'algo A* de Zeh, oui :p
Polykrom >> En voyant ta demo sur ce que tu appelles le "Wall Avoiding", c'est en fait le principe de contourner les coin, c'est bien ca ? Parce que je l'ai déjà implémenté dans mon pathfinder ca : http://www.lalex.com/blog/detail.php?id=61 ...
Lalex :
d'abord sorry pour le lien : http://www.polykrom.com/isotest/
tout a fait.. ton pathfinder l'implementait et pour moi c deja une reflexion portant sur le rendu
Polykrom >> C'est vrai, mais pas forcément lié à la 3D : en 2D, si on ne l'implémente pas, on va aussi passer sur/sous les coins ...
Salut
Un site consacré à la 3d iso ... fantastique !!!
http://www.nabboproject.com/index.htm
A+
pourquoi ne pas déposer les sources à la communauté ?
SamSam >> Comment ca ?
Si tu parles des sources de ce que j'ai fait, elles sont trop peu avancées pour que je les mette à disposition pour l'instant. Mais elles seront disponibles sur ce blog dés que je l'estimerai possible. 
Si tu parles des sources de qq'un d'autres (le lien précédent peut-être ?) ben ...désolé !
Bonjour.
J'aimerai savoir quel est le moyen de créer une matrice qui servirait de génératrice de décor pour un jeu d'aventure en flash...Je ne sais pas si je m'adresse au bon endroit.
Merci.
Bonjour.
J'aimerai savoir quel est le moyen de créer une matrice qui servirait de génératrice de décor pour un jeu d'aventure en flash...Je ne sais pas si je m'adresse au bon endroit.
Merci.
Ca donne vraiment envie de s'y mettre, et d'ailleurs, je suis en train de commencer un moteur 3d / 2d iso (je vois pas pourquoi dire 3d, si je fais ça en 2d...), et j'aimerais avoir ton avis...
Voici le posts sur mon site : http://www.wox-xion.org/index.php?mPath=main&subPath=reader&nid=14
J'ai débuté le schéma d'une map, et je suis en train de m'occuper de créer un visionneur (car c'est ce qui compte...), et si tu peux m'indiquer où je peux trouver des infos à ce sujet... ça m'intéresserais.. beaucoup, merci...
@+!
PS : c'est simple de faire des schémas, mais pour visionner ça, moi je coince...
xion > Francis a fait une classe pour tranformer du XML en objets dont il nous fait partager le code : http://www.tweenpix.net/archives/000042.html
Parcours son blog, tu y trouveras une foule d'informations étant donné que c'est une peu sa spécialité !
++ ^^
merci beaucoup
@+!
Fil des commentaires de ce billet