PathFinder an ActionScript 2 : les sources
Par -Alexandre LEGOUT aka LAlex- le vendredi, septembre 19 2003, 13:01 - Projets - Lien permanent
Comme promis voici les sources de mon pathfinder. Il a été adapté pour être a peu prés correct avec l'interactivité que je voulais, mais il s'inscrit dans un cadre plus grand de moteur de jeu, donc tout seul, il perd un peu de sa rigueur ... :?
Vous pouvez donc maintenant cliquer sur la carte pour tester votre propre chemin, et choisir de ne pas faire de diagonales, ou de pouvoir faire une diagonale lorsque vous êtes au coin d'un mur (ce qui est déconseillé dans le cadre d'un moteur de jeu) ...
Vous trouverez dans l'archive une fichier flp (Projets Flash) qui vous donnera accés à tout le reste. Le pathfinder en lui-même se situe dans la classe map.Map et j'ai essayé de le commenter assez correctement, mais il restera assez flou si vous n'avez pas integré les notions du pathfinding A* ...
En ce qui concerne la 3D iso, je commence a peine à apréhender, donc tout n'est peut-être pas correct dans la manière d'organiser mon affichage. En fait, je voudrais bien savoir comment font les gens qui utilisent un moteur 3D iso pour leur affichage. Passent-ils pas des clips exportés de la librairie, ou utilisent-ils un autre moyen ? :roll:
Voila, amusez vous bien avec ce code !!! ![]()
petepx a également fait un pathfinder, qui est le portage de celui d'André Michelle en AS2. Plus d'infos sur son blog
Commentaires
Bon boulot
bravo 
Felicitations, ca a l'air de dechirer !
Je passe tout de suite tout ca au peigne fin et reviens plus tard te laisser mes commentaires
Merci de le partager !
Bon, c'est super bien !
Pros :
- C'est tres performant
- Ca fourmille d'idees interessantes comme la classe Array2 ou Point2 qui m'ont inspirees de nouvelles implementations dans les miennes (Grid et Vecteur).
Cons: (Si je peux me permettre quelques petites remarques critiques)
- Je trouve que c'est bizarre au niveau de l'encapsulation et du design. Pourquoi avoir choisi de gerer l'affichage dans la meme classe ? Et surtout pourquoi le pathfinder n'est pas une fonction bien encapsulee qui se refere juste a un tableau et deux points d'entree ? Je me permets cette remarque car je trouve qu'un portage eventuel de ton pathfinder dans l'etat des choses sur un autre moteur serait tres lourd a realiser et il est dommage que ta classe map ne reste pas juste un modele pour pouvoir gerer un autre style d'affichage : par exemple un monde en 2D.
- Pour ce qui est de l'isometrie, je priviligierai un systeme a etages, c'est a dire que le sol + le sable ne seraient pas au meme etage que les murs.
J'ai fait l'erreur dans mon premier moteur de tout baser sur un niveau et j'ai eu d'enormes problemes de gestion d'affichage pour la suite (personnages, anims, collisions ...).
En tout cas je te tire un grand coup de chapeu pour ce pathfinder en Flash le + performant a ma connaissance. Bravo LAlex !
Oui, je sais bien que l'encapsulation est un peu bizarre !
En fait, j'ai voulu me lancer trop vite la dedans ...
J'ai eu du mal a concevoir le fait que je peux distinguer les Tile de mon tableau a deux dimensions. Je vais repenser les classes, avec un systeme de tableau à deux dimensions dont chaque case contient le cout de déplacement. :roll:
En fait, j'ai tellement bloqué sur mes propriétés virtuelles throwable et cost que je n'ai pas vraiment réussi a prendre du recul... :? J'ai envie de faire tellement de trucs en même temps(pathfinder, gestion d'une map, 3D iso) que finalement je ne fait pas tout correctement ...
Par exemple, le temps ne devrait pas faire partie de la fonction, qui devrait retourner juste un tableau contenant le chemin.Le temps de calcul doit être calculé en dehors de la méthode !! :roll:
Pour la 3D iso, aurais-tu des ressources concernant ca ? En fait, je suis parti sans doc, et donc je ne connais aucune des notions de base qu'il faut certainement avoir ... j'ai juste improvisé !
Merci de tes remarques petepx : je mettrais mes modifs ici, avec un pathfinder plus générique !
HEllo

Moi j'ai des liens très théorique
- http://www.compuphase.com/axometr.htm
- http://www.progzone.free.fr/graphisme/3diso/3diso.html
- http://thillosen.free.fr/ancien/3diso.htm
Sinon en livre :
Micro-Applications : Carlo Blatz
bye
Bon, petepx avait tellement raison que je me suis jeté sur mon pathfinder pour le rectifier un peu.
Le même lien vous permettra de télécharger le correctif, mais le moteur d'affichage est toujours aussi moyen ... :?
J'ai donc créé une classe PathFinder avec une méthode statique qui prend en paramètre un tableau a deux dimensions et les coordonnées de départ et d'arrivée. Chaque case du tableau contient son cout de déplacement, avec 0 pour les cases ou l'on ne peut pas marcher ...
J'ai également sorti de la fonction la méthode d'heuristique, qui pourra être optimisé independamment. En effet, plus l'heuristique est proche du vrai chemin restant à parcourir, plus les recherches vont être précises, et donc porter sur moins de cases (et donc un algo plus rapde)
Je vais également me pencher maintenant sur le fait de garder la liste ouverte triée en permanence par rapport au coût F ... :roll:
Voila une bonne nouvelle !

Merci pour ce SAV à la Flash Gordon
Je jette un coup d'oeil des que j'ai un moment
Pour l'isométrie, va faire un tour sur le site de sénocular :
http://www.kirupa.com/developer/actionscript/index.htm
Pas mal de truc dedans, en plus!!
Wow, c'est tres fort!! Merci beaucoup de partager les sources. Je vais jeter un coup d'oeil en details des que je peux
Re
En ce Lundi matin, je viens de faire un petit test en incluant une methode findPath() dans ma classe Map qui appelle ta classe.
La methode statique findPath de ta classe PathFinder est bien appellee et les parametres ont l'air valides.
Malheureusement elle me renvoit undefined au lieu du tableau associatif attendu en retour.
Aurais-je omis qqchose dans mon implementation ?
Voici les details :
public function findPath(x0:Number,y0:Number,x1:Number,y1:Number) : Object {var st = getTimer();
var gridState:Array = new Array ();
for (var i=0; i<grid.x; i++) {
gridState[i] = new Array();
for (var j=0; j<grid.y; j++) {
Number(grid.getVal(i,j)) > 0 ? gridState[i][j] = 0 : gridState[i][j] = 10;
}
}
var pf = com.lalex.map.PathFinder.findPath (gridState, x0, y0, x1, y1);
trace(pf);
return {t : getTimer()-st, path:pf};
}
// tracetrace("mp:"+mp);
trace("x0:"+x0);
trace("y0:"+y0);
trace("x1:"+x1);
trace("y1:"+y1);
// Output avec une map sans obstaclemp:10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
x0:2
y0:2
x1:9
y1:9
Argh ... tu m'as foutu en l'air ma mise en page !!!

Je ne comprends pas, parce moi ca marche bien (je viens de le tester) :
var gr = new Array(10);for (var i=0 ; i<gr.length ; i++) {
gr[i] = new Array(10);
for (var k=0 ; k<gr[i].length ; k++) {
gr[i][k] = 10;
}
}
trace(map.PathFinder.findPath(gr,2,2,9,9));
Le retour donne
Je vois que tu as changé le nom du package ... as-tu bien changé ce nom dans la déclaration de la classe ?!? :roll:
Sinon, tu as du voir que je me sert des classes Point2 et Array2 dans le pathfinder : as-tu laissé ces classes (ou remplacé par les tiennes) ? :roll:
Par contre, c'est pas bête de commencer les packages par com.nomdelauteur ... Je fais rectifier ca ...
Desole, enorme boulette de ma part, je rentrais dans ma methode des sorties de textfield pour la tester, et Flash bizarrement ne m'indiquait pas de type mismatch alors que j'avais specifie des nombres comme tu peux le voir plus haut
Enfin voila, tout est nikel, encore bravo, et desole pour ma grosse fatigue de debut de semaine ^^ lol
Salut LALex !
Je tiens à exprimer mon admiration pour l'ensemble de ton travail au niveau FlashMX. C'est très impressionnant ! Tu places la barre très haut dis-moi ! Et il y a tout un tas de coders AS hyperdoués ! Dommage qu'il n'y a pas de boulot pour tout le monde. En tout cas, bon courage et bonne continuation !
Un admirateur
Fil des commentaires de ce billet