|
Question : Avez-vous déjà cherché à obtenir dans NWN2 ce que NWN1 proposait, à savoir permettre à un NPC de choisir la transition la plus proche lui permettant de rejoindre un objet situé dans une autre zone ?
C'est ce qu'on appelle le crossarea pathfinding, et je sais que sous des formes plus ou moins simples Ariok ou Deyonara et consorts ont fourni des solutions. Dans le cadre du système d'IA sociale que je prépare, je me suis retrouvé confronté au problème. Et j'ai mis au point une solution qui se trouve ici en anglais et en traduction plus ou moins automatique à la fin du post. En gros l'idée c'est que le moddeur utiliserait une application autonome ( java en l'occurence ) à laquelle il faudrait désigner le module à ouvrir. Il obtiendrait par défaut un fichier 2DA ou en option un fichier SQL. Celui ci désignerait pour chaque zone la meilleure transition pour rejoindre n'importe quelle autre. Et ainsi, passant de zone en zone, il pourrait atteindre l'objet final. Le calcul favoriserait les zones ayant les mêmes paramètres suivant :
TRADUCTION PLUS OU MOINS AUTOMATIQUE : Sujet: Comment mettre en œuvre pour NWN2 une solution pour avoir un PNJ allant de la zone A à Z compte tenu du graphe suivant. Code:
A à Z = zones A — B — C | | D — E — F | | G H — Z Code:
A à Z Domaines tags = de a à z = object transition tag –––––––––———————————— | | A | B | … | Z | –––––––––———————————— | A | | c | … | y | –––––––––———————————— | B | a | | … | z | –––––––––———————————— | … | … | … | | … | –––––––––———————————— | Z | b | d | … | | –––––––––———————————— Ex: A -> Z ( A -> Z => transition à D, D -> Z => transition à E, E -> Z => transition à H, H -> Z => passage à Z ) Donc le PNJ sera envoyé vers D en premier, puis une fois dans D vers E, dans E vers H et dans H vers Z. 1. Construire la matrice L des zones N dans le module: [area_tag, area_parameters] 2. Construire la matrice d'adjacence M [area_tag_from, area_tag_to] = transition_tag 3. Construire la matrice F avec un algorithme A* pour chaque L qui est un extérieur en utilisant M 4. Construire la matrice F avec un algorithme A* pour chaque L qui est un intérieur en utilisant M et F pour les extérieurs 5. Export de F vers un fichier Notes: • les paramètres de zones de L sont: Extérieur: true | false, naturel: true | false, souterrain: true | false • Ces paramètres de zones qualifient la distance entre les points: plus de paramètres identiques, zones plus proches • La différenciation des zones intérieur et extérieur permet l'optimisation heuristique : les zones intérieures dépendant généralement des extérieures pour se connecter entre elles. Questions: • Cas particulier: Extérieurs liée seulement à travers (un certain nombre d ') intérieur (s) • les zones instanciées de manière dynamique En nwscript: Code:
const int TRANSAREA_MOVE = 0x01; const int TRANSAREA_DONE = 0x02; // Moves Action subject to the area object /* Input An object tag to move to, area or not Output True if a transition was found */ int ActionMoveToAreaObject( string sObject ) { // 1. Configure // ============ // Get target area tag object oObject = GetObjectByTag(sObject); object oArea = GetIsArea( oObject ) ? oObject : GetArea(oObject); string sAreaTo = GetTag( oArea ); // Get source area tag string sAreaFrom = GetTag( GetArea( OBJECT_SELF ) ); // Sanity checks and error reporting … // 2. Get target object // ==================== if( sAreaFrom != sAreaTo ) { // Get transition object int nAction = TRANSAREA_MOVE; string sTransitionObject = GetAreaTransition( sAreaFrom, sAreaTo ); object oTarget = GetNearestObjectByTag( sTransitionObject ); } else { int nAction = TRANSAREA_DONE; object oTarget = oObject; } // Sanity checks and error reporting … // 3. Actions // =========== // Get transition object type int nObjectType = GetObjectType( oTransitionObject ); // Assign actions switch( nAction ) { case TRANSAREA_MOVE : // Assign actions switch( nObjectType ) { case OBJECT_TYPE_TRIGGER : // … break; case OBJECT_TYPE_DOOR : // … break; case OBJECT_TYPE_PLACEABLE : // … break; } break; case TRANSAREA_DONE : ActionForceMoveToLocation( GetLocation( oTarget ) ); break; } } // Calls static trans-area table /* Input Two area tags : source and target Output Nearest transarea transition tag */ string GetAreaTransition( string sAreaFrom, string sAreaTo ) { string sAreaTransition = ""; // Storage type depends on module switch or some const // if 2DA storage //… // if SQL storage //… return sAreaTransition; } |
17/10/2009, 15h10 |
|
Aller à la page... |
Crossarea Pathfinding ou Transitions de zones à zones pour les PNJs
Suivre Répondre |
|
Partager | Rechercher |
|
Merci C'est loin d'être fait encore...
Bonne chance pour tes recherches! |
02/11/2009, 09h43 |
|
|
Entre autre chose
|
10/08/2010, 17h49 |
|
|
Haha, le silence est assourdissant
Bon je mets le lien sur github, on sait jamais https://github.com/albancrommer/FTP Utiliser le bouton "Téléchargement" à droite |
22/02/2011, 22h10 |
|
Suivre Répondre |
Connectés sur ce fil1 connecté (0 membre et 1 invité)
Afficher la liste détaillée des connectés
|