Hello tout le monde
je poursuis ma folle ascension flashesque et je me suis lancé aujourd´hui dans une notion qui va me servir : le tile based mapping ( je m´occuperai de la 3d isometrique apres, je fais les choses 1 par une ^^).
J´ai lu plusieurs fois un excellent tutorial sur le sujet, j´ai pratiquement tout compris et en guise d´"exercie pratique", j´ai traduit et ajouté des commentaires au code.
Voici le résultat que j´ai obtenu, les questions que je me pose sont dans les commentaires, merci d´avance de toute réponse
Le code commenté:
/ / La map est un tableau en 2D
plaine = [[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]];
/ / Crée l´OBJET game, qui contient toutes les infos
game = {tileW:30, tileH:30};
/ / tile de type 0 ( herbe par exemple)
game.Tile0 = function() {
};
game.Tile0.prototype.walkable = true;
game.Tile0.prototype.frame = 1;
/ / tile de type 1 ( eau par exemple)
game.Tile1 = function() {
};
game.Tile1.prototype.walkable = false;
game.Tile1.prototype.frame = 2;
/ / fonction qui plce les tiles
function buildMap(map) {
// Crée le MovieClip " empty" ( = vide) qui contient tout : tiles et persos
_root.attachMovie("empty", " tiles", ++d);
// permet d´appeler tiles par game.clip ( inclus dans game)
game.clip = _root.tiles;
// on récupère les dimensions de la map a partir de l´array
var mapWidth = map[0].length;
var mapHeight = map.length;
// boucle qui place les tiles rangée par rangée
for ( var i = 0; i<mapHeight; ++i) {
for ( var j = 0; j<mapWidth; ++j) {
// mets le nom le tile qu´on s´apprete a placer en variable ( avec ses coordonnées)
var name = " t_"+i+"_"+j;
// crée le tile qu´on s´apprete a placer et le nomme ( trad. pas sure)
game[name] = new game["Tile"+map[i][j]]();
// attache le clip " tile" à empty, lui donne son nom d´occurences et...?
game.clip.attachMovie("tile", name, i*100+j*2);
//donne ses coordonnées au tile sur la scene ( coord * largeur/hauteur du tile)
game.clip[name]._x = ( j*game.tileW);
game.clip[name]._y = ( i*game.tileH);
// j´ai pas compris comment mais on va à la frame de tile qui represente tile0 ou tile1
game.clip[name].gotoAndStop(game[name].frame);
}
}
}
/ / appel de la fonction qui génère la map et stop
buildMap(myMap);
stop();
et dodo ![]()
Hummm . ..peut tu donner le lien de ton tutorial > j´aimerais voir le code original non commente . .. parce qu´il me semble que tu y a inclus des erreurs ( par exemple, ce n´est pas buildMap(myMap); mais buildMap(plaine);
)
de plus, il y a pas mal d´elements qui pourraient etre codes autrement, et je ne comprends pas pourquoi il s´y est prit de cette maniere
c´est effectivement la ligne
game.clip[name].gotoAndStop(game[name].frame);
qui me pose soucis dans la mesure ou je ne vois pas le sens de " frame" : c´est une variable non declaree nulle part, et n´est pas une procedure de flash , a moins que ce ne soit qu´un code specifique a Flash MX 2004 ( que je ne connais pas ) . ..
Pour moi, la maniere de proceder serait de mettre
game.clip[name].gotoAndStop(game[name].map[i][j]+1
);
( +1 parcequ´un array commence a 0, alors que les frames commencent a 1 )
Bref, je suis embrouille
Donc le lien vers le tut serait sympa pour tirer ca au clair . .
sinon, dans ta ligne
game.clip.attachMovie("tile", name, i*100+j*2);
le i*100+j*2 sont utilises pour faire le Z-sorting, ce qui te permet de savoir quelles tiles sont devant les autres > i*100+j*2 vont donc te donner la profondeur ( depth) . .. ce qui la non plus ne fait pas beaucoup de sens dans le mesure ou on est en 2D plate et non ISO . ..
alors dans l´ordre: le lien du tuto est ici:
http://www.tonypa.pri.ee/tbw/tut02.html
je tiens a dire a quel point ce site est merveilleux ( mais pas optimisé pour mx je crois), j´ai tout survolé et je me suis attaqué au detail, c´est dans un anglais simple, bien détaillé...bref le reve
Pour le myMap au lieu de plaine, je n´avais pas fait attention, j´avais au debut en projet de créer une map de plaine mais j´ai changé d´avis en cours de route ( mon but final etant l´isometrique, je vais pas me casser le c..a faire de beux tiles standards) et j´ai oublié de changer le nom lors de l´appel de la fonction ( il me semble qu´a part les commentaires c´est tout ce que j´ai bidouillé)
Concernant:
game.clip[name].gotoAndStop(game[name].map[i][j]+1
) ;
le game.clip[name] permet d´accéder au tile qu´on vient de placer, on lui fait un gotoandstop mais je comprends pas bien ce que viennent faire les coordonnées du tile [i] et [j] dans le choix de la frame la dedans
Et enfin, la profondeur, je comprends maintenant le systeme mais je vois pas comment sont déterminés les valeurs, pourquoi attribuer 100i+2j et pas 95i+8j par exemple? c´est pour que les tils se superposent en ordre logique dans le cas de l´isometrique? ( tiles en bas a gauche par dessus ceux de droite)
Merci beaucoup en tout cas ![]()
Je vais regarder ca
. .. effectivement, c´est le site de reference
donc il doit y avoir de bonne raisons . .. et vu que je le connais bien, si je ne comprends toujours pas, je lui demanderai directement :D
j´avais pas vu
game.Tile0.prototype.frame = 1;
va avec
game.clip[name].gotoAndStop(game[name].frame);
C´est dans la declaration de la nature des tiles qu´est declaree la frame cible
. ..la faute a la presentation pourrie du code dans jeuxvideo.com, c´est super pas clair a lire
Donc la question de la frame etant resolue . ..
pour le reste, regarde aussi :
http://oos.moxiecode.com/tut_01/index.html
C´est le " maitre" a penser de Tonypa, meme si ils ont des methodes differentes - tu verra que le code est plus simple, et ne comporte pas ce parametre de profondeur qui est intriguant . ..
J´essaye de te trouver une reponse, et revient vers toi ![]()
Bon ;
game.clip.attachMovie("tile", name, i*100+j*2);
pourrait etre remplace par
c++;
game.clip.attachMovie("tile", name, c); / /(essaye, tu verra . ..et c´est tout de meme plus simple)
ca marcherai pareil : la seule condition, c´est de rajouter la ligne d´incrementation
c++;
avant de dessiner tes tiles . .. je cherche toujours a comprendre pourquoi il s´y est pris comme ca, en general, Tony ne fait pas les choses sans raisons ![]()
humm . ..je suis idiot :
game.clip.attachMovie("tile", name, c++);
marche pareil, et ca t´economise une ligne . ..
ATTENTION > tu ne peux te permettre cela que parce que Flash autorise la creation de variable au vol
. ..tu ferais ca dans un autre langage, comme le c++ ( justement
) tu te ferais taper sur les doigts ![]()
J´avais oublie cette question >
je comprends pas bien ce que viennent faire les coordonnées du tile [i] et [j] dans le choix de la frame la dedans
Ce n´est pas dans le choix de la frame, mais dans le choix du chemin pour acceder a la bonne tile : et comme j´ai fait ca vite, je me suis trompe
:
l´idee est d´acceder au bon movieclip en allant checher la bonne frame ; dans ce cas, par exemple, ta premiere tile ( [0][0] s´appelle t_0_0 ( puisque name = " t_"+i+"_"+j ) ... et dans ce movie clip, tu lui fais afficher la frame 1 ou 2
du coup :
game.clip[name].gotoAndStop(game[name].frame);
et
game.clip[name].gotoAndStop(game["t_"+i+"_"+j].fra
me);
veulent dire la meme chose . .. mais tu comprends ma betise d´avoir voulu faire sauter la variable puisqu´au final, elle rend l´instruction plus lisible ![]()
Je résume ce que j´ai compris:
Apres " réecriture", la ligne :
game.clip.attachMovie("tile", name, c++);
permet d´afficher chaque tile plus " haut" que le precedent ( mais cela n´est utile que dans le cas de l´isometrique).
Dans:
game.clip[name].gotoAndStop(game[name].frame);
le . frame permet d´acceder à la propriété ( désolé, je ne connais pas les termes exacts) frame du tile dont on s´occupe actuellement ( tile désigné par [name]),et ainsi de mettre la frame1 si c´est un tile 0 et la frame2 si c´est un tile1 .
( c´est surtout le . frame que je comprennais pas).
Merci beaucoup, c´est beaucoup plus agréable de comprendre ce qu´on fait ![]()
Je viens de lire le lien que tu m´as donné, cela confirme ce que j´avais compris ( notamment sur la profondeur) ![]()
Introduction:
Fort de la comprehension de ce chapitre, j´ai tenté de passer la map en isometrique, j´ai survolé tres vite les chapitres precedent celui la histoire de pas trop perdre le fil puis j´ai tenté d´adapter le code pour n´avoir que la map ( pas le personnage etc etc..), j´ai donc fait beaucoup de mofications...
mon resultat de code est ici ( avec commentaires vites faits):
http://mickledingue.free/fr/filrazorback/hsite/isomap.txt
Précision :
-J´ai crée un mc tile ( lié a l´Action script sous le meme nom) qui contient en frame 1 de l´herbe et en frame 2 de l´eau. Mes tiles ( vites faits ) ont pour dimensions 42*22 px ( si on les mets dans un rectangle)
Problème:
Ca marche pas, rien ne s´affiche
Merci d´avance de me expliquer/signaler/corriger les erreurs ( y´en a surement pas mal)...
En esperant comprendre ce chapitre avant ce soir ( sinon jvais pas reussir à m´endormir
) , merci d´avance ![]()
lien foireux? deuxieme essai ( je suis sur du lien, si ca marche pas ca vient de jvcom):
http://mickledingue.free.fr/filrazorback/hsite/isomap.txt
nan, tu ne peux pas me mettre que le code > il faut me mettre le fichier en entier, enregistre en Flash MX ( je n´ai pas 2004)
Sinon, la depth n´est pas aussi simple que cela - oui, cela permet de gerer la profondeur, mais il faut aussi savoir que Flash n´aime pas avoir deux MC sur le meme niveau ET SURTOUT PAS au niveau 0
( ouisque c´est la profondeur par defaut de tout ton code )
donc, la ligne d=0; cree une erreur . ..
ainsi que clip.attachMovie("tile", name, d);
devrais logiquement etre d++ ( tu incremente d de 1 a chaque fois )
mais encore une fois, sans le fichier complet, je peux me tromper . ..
je te fais un lein tout de suite ![]()
http://mickledingue.free.fr/filrazorback/hsite/tile_based_map_iso_mx.fla
une petite precision : je ne suis pas tout a fait sur que ce code soit approprie pour un debutant, j´avais la flemme d´expliquer pourauoi hier soir, mais j´ai plus de temps ce matin :
Dans ta traduction, il y a 2 parametres important qui t´ont echappe, et sur lesquels tu aurais du me poser des questions, le probleme etant que je ne suis pas sur de pouvoir y repondre
game.Tile0 = function() {}; avec les prototypes qui s´ensuivent
et
game[name] = new game["Tile"+map[i][j]]();
Ces deux lignes sont extremement importantes, et contribuent a toute la philosophie du moteur de Tonypa, et de son code en general
Si tu compare avec http://oos.moxiecode.com/tut_01/index.html
tu te rendra compte que le code est le meme, a l´exception de ses lignes ( en incluant les prototypages des tiles0 et tiles1 )
Pourquoi ?
Parce que le moteur de Tonypa est base sur une philosophie Object Oriented : il cree un objet ( Tilenumber), et le prototype, pour ensuite le decliner via newGame de facon a ce que chaque nouvelle iterence beneficie des proprietes de bases ( et donc, par consequent, te permette d´acceder a la propriete frame )
C´est une bonne methode, mais ce n´est pas une methode avec laquelle je suis confortable ; je sais l´appliquer, la reutiliser, mais j´aurais vraiment beaucoup de difficultees a t´expliquer " pourquoi" et " comment" . ..
Je me permet de reinsister sur les tutoriaux de
http://oos.moxiecode.com/#Tutorials
qui sont dans un anglais aussi simple, mais BEAUCOUP plus accessibles pour quelqu´un qui n´est pas encore familiarise avec les fonctions . .. au moins, etudie les deux en parrallele, histoire de voir les differences de code, pour mieux comprendre ce que tu fais
La, j´aimerais bien que d´autres codeurs interviennent, et t´explique les concepts simples de l´Objet, et en quoi c´est une methode plus appropriee que celle de Jailbitch ( Moxiecode ) . ..parce que dans ce cas je planche . ..
Pour la petite histoire, c´est Tonypa qui a declenche Two Kingdoms, mon RPG . ..
j´en ai beaucoup discute avec lui, et a l´epoque, je debutais en Flash, et je me basais sur son code . .. puis je me suis vite rendu compte que son code devenait vite TRES complexe quand il s´agissait d´un moteur qui devenait trop complexe pour moi, j´ai donc modifie mon moteur pour le mettre plus dans la ligne de celui de Moxicode . ..et ja´i eut beaucoup moins de problemes
. ..
Son code est excellent, mais je ne suis pas sur qu´il s´agisse du meilleur outil pour commencer . ..
Merci de ta reponse, je vais donc consulter les tuytos moxiecode en priorité;
Concernant la POO, j´ai de vagues notions qui me viennent essentielement du javascript et d´un site que j´ai consulté la semaine derniere dont j´ai paumé l´adresse, c´est un systeme qui ne me plait pas beaucoup, je trouve ca assez tordu...
J´aimerai pouvoir te parler un peu ( 5-10 minutes) en " privé" du projet que je tente de mener à bien pour savoir si tu le penses réalisable, as tu une messagerie instantanée? je te donne les mienne ( si ca peut t´eviter d´etre harcelé par les fans mdr...):
msn:
fil_razorbak@hotmail.com
AIM:
fil1razorbak
merci d´avance ![]()
( je viens de feuilleter 2-3 tutos de moxicode, je me retroube beaucoup mieux dans le code, ca utilise que des notions que je connais ( dans ce que j´ai lu), merci une fois de plus
)
Bon, je viens de corriger ton code, en me basant sur la methode Tonypa . .. je n´avais jamais regarde de pret, mais je comprends de moins en moins pourquoi il fait certaines choses . .. franchement, je te conseille de t´appliquer sur les tutoriaux de Moxiecode . .. ce sera aussi plus facile pour moi de t´expliquer . ..
bref, voici le code a remplacer :
http://grafikdezign.free..fr/jeuxvideos/comment_iso.txt
Comme tu le vois, tu as oublie PLEIN de choses : passer de la 2D a la 2D iso n´est pas une promenade, et est beaucoup moins simple que les deux bouts de codes que tu avais change :D
Bref, copie / code le code, teste, cela devrait marcher . .. ( par contre, l´antialiasing sur tes tiles fait que c´est moche
)
En ce qui concerne ton projet, je prefererai que tu m´en parle ici : je n´ai pas beaucoup de temps pour ICQ, et vu que je travaille avec, je detesterai etre derange en plein milieu d´une reunion . .. le mieux, c´est que tu m´expose tes idees dans ce topic, je te dirai ce que j´en pense