3 participants
Pathfinding
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°26
Re: Pathfinding
Bah j'y peut rien chui passé en mode berserk de boulot la mais je vais bien devoir m'arrêter vu que a priori je suis au chômage technique.
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°27
Re: Pathfinding
Si tu tiens à bosser, t'as aussi du Java3D à faire ^^
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°28
Re: Pathfinding
Ouai nan si je me met à faire du java la ça va complètement casser mon combo de c++ je préfère continuer dans ma lancer (puis c'est pas comme si le projet d'ihm m'intéressait énormément ^^)
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°29
Re: Pathfinding
Il m'a semblé comprendre que tu as fait deux choses :
- le pathfinding de base, qui te retourne un chemin entre deux points => fonction aStar(...)
- une variante qui permet d'avoir la liste des cases auxquelles un groupe peut accéder à partir d'une case donnée. Mais pour ça, on fait comment ?
edit : je pense aussi à un autre truc. Lorsque le moteur de jeu doit dire si un archer peut attaquer à distance ou non, ça passe aussi par le pathfinding, mais ta fonction aStar ne peut pas être utilisée (il faut que toutes les cases coûtent 1.0). Il faudrait donc une variante pour ce cas là. D'ailleurs, il y a l'altitude à prendre aussi en compte. Petit rappel :
Si on a :
- Montagne = altitude de 2
- Plaine = altitude de 0
- Archer = portée de 5
Alors :
- un archer sur une montagne peut atteindre des plaines situées à une distance de 7 au max
- un archer sur une plaine peut atteindre des montagnes situées à une distance de 3 au max
- le pathfinding de base, qui te retourne un chemin entre deux points => fonction aStar(...)
- une variante qui permet d'avoir la liste des cases auxquelles un groupe peut accéder à partir d'une case donnée. Mais pour ça, on fait comment ?
edit : je pense aussi à un autre truc. Lorsque le moteur de jeu doit dire si un archer peut attaquer à distance ou non, ça passe aussi par le pathfinding, mais ta fonction aStar ne peut pas être utilisée (il faut que toutes les cases coûtent 1.0). Il faudrait donc une variante pour ce cas là. D'ailleurs, il y a l'altitude à prendre aussi en compte. Petit rappel :
Si on a :
- Montagne = altitude de 2
- Plaine = altitude de 0
- Archer = portée de 5
Alors :
- un archer sur une montagne peut atteindre des plaines situées à une distance de 7 au max
- un archer sur une plaine peut atteindre des montagnes situées à une distance de 3 au max
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°30
Re: Pathfinding
- une variante qui permet d'avoir la liste des cases auxquelles un groupe peut accéder à partir d'une case donnée. Mais pour ça, on fait comment ?
Pathfinding* pf = new Pathfinding(); //on creer l'objet pf
type = &(GestionnaireDonnees::getInstance().getPartie().getGroupesJoueur(1)[0]->getTypeUnite()); //(juste pour récupérer un type au hasard, le tout c'est d'avoir un type à donner)
debut.x=1;//on créer une struct coordonnées pour avoir la position de départ de l'unité
debut.y=3;
plop = pf->posibilitesDeplacement(debut,type); //puis l'appelle
je ferait ça pour les archers (mais au final je vais pas implémenter la moitié des règles de jeu dans le pf ? ^^)
Pathfinding* pf = new Pathfinding(); //on creer l'objet pf
type = &(GestionnaireDonnees::getInstance().getPartie().getGroupesJoueur(1)[0]->getTypeUnite()); //(juste pour récupérer un type au hasard, le tout c'est d'avoir un type à donner)
debut.x=1;//on créer une struct coordonnées pour avoir la position de départ de l'unité
debut.y=3;
plop = pf->posibilitesDeplacement(debut,type); //puis l'appelle
je ferait ça pour les archers (mais au final je vais pas implémenter la moitié des règles de jeu dans le pf ? ^^)
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°31
Re: Pathfinding
J'ai pas tout compris. Pourquoi une fonction "posibilitesDeplacement" pour des problèmes de portée ?
Et si tu veux qu'à un moment on passe un type au hazard à ta fonction, ça serait plutôt à la fonction de le faire au début de son code non ?
Et si tu veux qu'à un moment on passe un type au hazard à ta fonction, ça serait plutôt à la fonction de le faire au début de son code non ?
J'aurais plutôt dit les 3/4...(mais au final je vais pas implémenter la moitié des règles de jeu dans le pf ? ^^)
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°32
Re: Pathfinding
sebastien a écrit:- une variante qui permet d'avoir la liste des cases auxquelles un groupe peut accéder à partir d'une case donnée. Mais pour ça, on fait comment ?
Pathfinding* pf = new Pathfinding(); //on creer l'objet pf
type = &(GestionnaireDonnees::getInstance().getPartie().getGroupesJoueur(1)[0]->getTypeUnite()); //(juste pour récupérer un type au hasard, le tout c'est d'avoir un type à donner)
debut.x=1;//on créer une struct coordonnées pour avoir la position de départ de l'unité
debut.y=3;
plop = pf->posibilitesDeplacement(debut,type); //puis l'appelle
comme je l'ai dit la je parle de la fonction qui renvoie la liste des cases ou l'on peut se déplacer.
et non c'est pas un type au hasard qu'on veux, c'est le type de l'unité dont on cherche le déplacement. si je veux savoir ou peut se déplacer un archer en (3,3) je dois appeler la fonction deplacementPossible((3,3),archer)
le programme pourrait aller récupérer lui même le type de l'unité présente en (3,3) mais j'ai fait ca comme ca on peut appeler cette méthode même si on a pas réélement d'archer en (3,3) si on a besoin d'une simulation
edit : pour les portée pour le moment j'ai encore rien fait pour ça. je vais le faire
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°33
Re: Pathfinding
Je pensais au calcul de la portée, et donc que s'il fallait bidouiller un truc pour passer un type au hasard, il fallait mieux le cacher profondément dans le code
Hem... Enfin bon, ok ^^
Hem... Enfin bon, ok ^^
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°34
Re: Pathfinding
mais en fait il est ou le pathfinding dans le calcul de la portée ? vu que pour la portée toute les cases sont de poids 1 c'est plus du pathfinding :/
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°35
Re: Pathfinding
Euuuuh oui, laisse tomber, je le ferai :p (et merde, j'ai raté une occasion de ne rien faire )
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°36
Re: Pathfinding
T'en es où pour ces deux trucs ?
- Code:
int calculerDistance(Coordonnees case1, Coordonnees case2) { return 1; }
vector<Coordonnees> calculerDeplacementsPossibles(Coordonnees coordGroupe, TypeUnite* typeUnite) {return vector<Coordonnees>();};
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°37
Re: Pathfinding
Bah, les déplacements possible y sont depuis des lustres nan ? la méthode s'appelle posibilitesDeplacement
calculer distances, heu oublié ça. Je m'y mettrais dès que jai fini l'ihm
calculer distances, heu oublié ça. Je m'y mettrais dès que jai fini l'ihm
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°38
Re: Pathfinding
Depuis des lustres, mais juste chez toi non ? A moins que j'ai loupé un chapitre
Enfin bon, m'en fous pour le moment, je vais manger
Enfin bon, m'en fous pour le moment, je vais manger
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°39
Re: Pathfinding
Si si elle était la... perdue dans les copier coller....
Heureusement j'ai une sauvegarde chez moi (vive les dépôts svn quand même )
http://www.megaupload.com/?d=EGNSLHLZ
Heureusement j'ai une sauvegarde chez moi (vive les dépôts svn quand même )
http://www.megaupload.com/?d=EGNSLHLZ
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°40
Re: Pathfinding
Quelques bugs :
- la fonction aStar se moque totalement de la distance du chemin à parcourir. Une unité avec 5 pts de déplacement peut se déplacer de 20 cases si on le demande.
- cette même fonction plante régulièrement, au niveau de ce code là :
- la fonction posibilitesDeplacement retourne toujours un vecteur vide, que le groupe en question fasse partie d'un troupeau ou soit isolé.
- la fonction aStar se moque totalement de la distance du chemin à parcourir. Une unité avec 5 pts de déplacement peut se déplacer de 20 cases si on le demande.
- cette même fonction plante régulièrement, au niveau de ce code là :
- Code:
//on remet le chemin a l'endroit
vector<Coordonnees>::iterator it;
it=chemin.end();
while(it!=chemin.begin())
{
chemin.push_back(*it);
chemin.erase(it);
it--;
}
chemin.push_back(chemin.front());
chemin.erase(chemin.begin());
- Code:
vector<Coordonnees> cheminInverse;
cheminInverse.reserve(chemin.size());
for(int i = chemin.size() - 1; i >= 0; i--)
cheminInverse.push_back(chemin[i]);
- la fonction posibilitesDeplacement retourne toujours un vecteur vide, que le groupe en question fasse partie d'un troupeau ou soit isolé.
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°41
Re: Pathfinding
Connaissait pas les reverse ^^
Pour les déplacements de 20cases me semblait avori tester mais visiblement non
Pour els possibilités de déplacements, montre moi ac quelles données tu le lance, ça a tjr marché chez moi.
Pour les déplacements de 20cases me semblait avori tester mais visiblement non
Pour els possibilités de déplacements, montre moi ac quelles données tu le lance, ça a tjr marché chez moi.
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°42
Re: Pathfinding
http://xerius.nuxit.net/glouglou/screenshot.jpg
J'ai testé pour tous les groupes présents ici, et niet :p (casesAccessibles.size() == 0 à la fin, et j'ai vérifié que les paramètres passés en entrée soient les bons).
J'ai aussi ajouté un groupe totalement séparé des autres pour tester, et pareil :/
J'ai testé pour tous les groupes présents ici, et niet :p (casesAccessibles.size() == 0 à la fin, et j'ai vérifié que les paramètres passés en entrée soient les bons).
J'ai aussi ajouté un groupe totalement séparé des autres pour tester, et pareil :/
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°43
Re: Pathfinding
Tu l'appelle comment la méthode ?
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°44
Re: Pathfinding
- Code:
std::vector<Coordonnees> Regles::calculerDeplacementsPossibles(Coordonnees& coordGroupe) {
/* On vérifie que les coordonnées choisies soient celles d'une case utilisable de la carte (cad pas
située sur la bordure, ni à l'extérieur */
if(coordGroupe.x <= 0 || coordGroupe.y <= 0 || coordGroupe.x >= partie.getLargeurCarte() - 1 ||
coordGroupe.y >= partie.getHauteurCarte() - 1)
return vector<Coordonnees>();
/* On vérifie qu'il y ait bien un groupe sur la case choisie */
Groupe* groupe = partie.getGroupe(coordGroupe);
if(groupe == NULL)
return vector<Coordonnees>();
/* On peut enfin lister les déplacements possibles */
TypeUnite* type = &groupe->getTypeUnite();
Pathfinding p;
return p.posibilitesDeplacement(coordGroupe,type);
}
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°45
Re: Pathfinding
Heu sauf que si j'avais voulu faire ça je l'aurais fait... J'ai justement mis que je vérifie pas qu'il y ai de groupes sur la case sélectionné pour pouvoir lancer des simulations.
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°46
Re: Pathfinding
Rien n'oblige à se servir de cette fonction pour utiliser la tienne, je ne vois pas où est le problème...
sebastien- Messages : 137
Date d'inscription : 24/01/2009
- Message n°47
Re: Pathfinding
http://www.megaupload.com/?d=FISXFDMC
voici pour la petite correction.
Sinon :
- Quentin, j'ai l'impression que tu charge pas les couts de déplacements de chaque terrain dans les unités. Je reçoit toujours 1, et j'ai pas vu de ligne pour les charger dans ta fonction.
- cedric : on peut cliquer et se déplacer en dehors de la surbrillance.
voici pour la petite correction.
Sinon :
- Quentin, j'ai l'impression que tu charge pas les couts de déplacements de chaque terrain dans les unités. Je reçoit toujours 1, et j'ai pas vu de ligne pour les charger dans ta fonction.
- cedric : on peut cliquer et se déplacer en dehors de la surbrillance.
Quentin- Messages : 120
Date d'inscription : 24/01/2009
- Message n°48
Re: Pathfinding
sebastien a écrit:
- Quentin, j'ai l'impression que tu charge pas les couts de déplacements de chaque terrain dans les unités. Je reçoit toujours 1, et j'ai pas vu de ligne pour les charger dans ta fonction.
pourtant dans void Config::lireFichierConfigUnite(const char* filepath) :
- Code:
if (key == "cout_plaine")
{
lesConfig.configUnite[lesConfig.nbUnite].cout_plaine = atof(value.c_str());
continue;
}
if (key == "cout_montagne")
{
.....
j'ai testé et ça marche
- Code:
cout << "cout marais " << lesCarac.configUnite[2].cout_marais << " " << lesCarac.configUnite[2].idUnite << endl;
cout marais 1.5 cavalier_leger
Cédric- Messages : 205
Date d'inscription : 24/01/2009
- Message n°49
Re: Pathfinding
Ce que tu testes, c'est "lesCarac", ça ne dit pas que la création des objets "Groupe" se fait correctement au final :p (mais autant c'est ma fonction pour obtenir le coût qui merde )
Quentin- Messages : 120
Date d'inscription : 24/01/2009
- Message n°50
Re: Pathfinding
tout ce que je dis, c'est que je charge bien les cout de déplacement sur les terrains. Après voila
|
|