Probleme Pathtfinding

gilbert_ Messages postés 1 Date d'inscription mardi 23 mai 2006 Statut Membre Dernière intervention 12 juillet 2006 - 12 juil. 2006 à 17:59
cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 - 13 juil. 2006 à 10:17
Bonjour tout le monde !


Je me suis mis en tête de réaliser mon code perso de pathfinding
inspiré du célèbre A* , je touche preske au but, lorsque le chemin
n'est pas trop compliqué mon script marche, mais dès lors que celui-ci
devient trop long, la console m'indique qu'il y a plus de 256 niveaux
de récursions et que l'action a été arrêtée, et je ne comprend pas trop
pourquoi, car je n'ai pas l'impression d'avoir une boucle infinie...


Voila le code si quelqu'un est motivé pour trouver d'ou vient l'erreur.
Sur la précendente frame j'ai créé un tableau de de 40 cellules sur 30
chacune nommée "casex_y" avec une propriété traversable initialisée sur
true ou false.


Merci d'avance !


Gilbert

liste_ouverte = [] ;

liste_fermee = [] ;


case_en_cours = case1_1;

case_en_cours.x = 1;

case_en_cours.y = 1;

case_en_cours.cout_parcouru = 0;

case_finale = case28_28;

case_finale.x = 28;

case_finale.y = 28;


ajout_liste_fermee(case_en_cours);


//fonction qui ajoute a la liste fermée

function ajout_liste_fermee(case_en_cours )

{

   

    trace("ajout_liste_fermee");

   

    //trace(case_en_cours.parent);

   

    //trace(case_en_cours);

    //on degage le premier élement de la liste ouverte

    liste_ouverte.splice(0,1);

    liste_fermee.push(case_en_cours);

   

    //on precise que la case fait partie de la liste fermee

    case_en_cours.fermee = true;

   

    // on detecte les cases autour de la case en cours

    if( case_en_cours != case_finale)

    {

        detection_cases(case_en_cours);

        case_finale.parent = case_en_cours;

    }

    else

    {

       

       

        dessine_chemin( case_finale );

    }

   

   

}


function detection_cases (case_en_cours)

{

   

   

    trace("detection_cases");

   

   

   

    _root.clic = 0;

    _root.clic2 = 0;

    //boucle qui permet de regarder les cases autour de la case ou l'on se situe

    for(var  j = -1 ; j < 2; j++)

    {

        for(var i = -1; i< 2; i++)

        {

           

            case_analyse =
this["case" + (case_en_cours.x + i) + "_" + (case_en_cours.y + j) ];

            case_analyse.x = case_en_cours.x + i * 1;

            case_analyse.y = case_en_cours.y + j * 1;

            // on lance le processus de calcul de distance pour cette case

           
if(case_analyse.traversable == true  &&
case_analyse.fermee != true )

            { 

                calcul_case(case_analyse,case_en_cours);

            }

           

           

        }

       

       

       

    }

   

   

   

   

    //on trie le tableau par ordre décroissant

    liste_ouverte.sortOn( "cout_total", Array.NUMERIC );

   

    trace("liste_ouverte " +  liste_ouverte.length);

    ajout_liste_fermee( liste_ouverte[0].node );

   

}


function calcul_case(case_a_calc,parent)

{

    trace("calcul_case");

   

   

           
    //on regarde si la case est situé en diagonale ou non

           
    if( ( Math.abs(case_a_calc.x - parent.x) +
Math.abs(case_a_calc.y - parent.y) ) > 1)

                {   

           
        var cout_parcouru =
parent.cout_parcouru + 1.4 ;

                   

                   

                }

                else

                {

           
        var cout_parcouru =
parent.cout_parcouru  + 1 ;

                   

                }

               

               

               

                //si la case n'a pas encore été visitée

                if( case_a_calc.cout_parcouru == undefined )

                {

                   

           
        case_a_calc.cout_parcouru =
cout_parcouru;

                    case_a_calc.parent = parent;

                   

                   

                   

                   

           
        //on calcule la distance a
parcourir pour atteindre la fin

           
        var cout_fin = Math.abs(
case_a_calc.x - case_finale.x) + Math.abs( case_a_calc.y -
case_finale.y)

           
        case_a_calc.cout_total =
case_a_calc.cout_parcouru + cout_fin;

       

           
        //on rajoute la case a la liste
ouverte

           
        liste_ouverte.push( {node:
case_a_calc, cout_total: case_a_calc.cout_total} );

                   

                }

                else

                {

           
        //si la nouvelle trajectoire est
plus courte que l'ancienne

                   

           
        if( cout_parcouru <
case_a_calc.cout_parcouru )

                    {

           
            //on lui
assigne sa nouvelle distance parcourue

           
           
case_a_calc.cout_parcouru = cout_parcouru;

                       

           
            //on calcule
la distance a parcourir pour atteindre la fin

           
            var cout_fin =
Math.abs( case_a_calc.x - case_finale.x) + Math.abs( case_a_calc.y -
case_finale.y)

           
           
case_a_calc.cout_total = case_a_calc.cout_parcouru + cout_fin;

                       

           
            //on lui
assigne son nouveau parent

           
           
case_a_calc.parent = parent;

                       

                       

                    }

                   

                }

               

               

               

               

   

   


               

   

           

   

   

}


function dessine_chemin(casex)

{trace("dessine_chemin");

   

   

   

    if(casex.parent != undefined)

    {

        //trace("parent" + casex.parent);

        casex.parent["dessin"].removeMovieClip();

        casex.parent["dessin"] = casex.parent.createEmptyMovieClip("sgsg", 1);

        casex.parent["dessin"].lineStyle(1,0x000000,100);

        casex.parent["dessin"].beginFill(0x00BC00, 100);

        casex.parent["dessin"].moveTo(0,0);

        casex.parent["dessin"].lineTo(largeur , 0);

        casex.parent["dessin"].lineTo(largeur , hauteur);

        casex.parent["dessin"].lineTo( 0 , hauteur );

        casex.parent["dessin"].lineTo(0,0);

        casex.parent["dessin"].endFill();

        dessine_chemin( casex.parent );

    }

   

   

}


stop();

1 réponse

cs_bali_balo Messages postés 1378 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 1 novembre 2010 1
13 juil. 2006 à 10:17
Flash est limité à 256 boucle imbriqué au niveau des fonctions réccursives...
On ne peut pas faire autrement ....

Améliore ton script, ou bienfait le passer par un autre script.

bali_balo....=]
0
Rejoignez-nous