|
| IA Simple de déplacement | |
| | Auteur | Message |
---|
Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: IA Simple de déplacement Dim 20 Juil 2008 - 19:10 | |
| Bonjour, voila pas mal de temps que j'ai commençais mon projet (en janvier 2008) et depuis le début je sais que l'IA va être la chose la plus dur à faire, en effet je vient que de débuter en programmation et ne connais que les bases. Maintenant je doit attaquer l'IA. cette IA est très simple a expliquer ^^ Je chercher à faire une IA de déplacement (c'est un jeu vu de haut), il y a beaucoup de mur et d'obstacle. des objets doivent se rendre a un objet bien déterminé (zombies ) malheureusement la fonction - Code:
-
mp_potential_step est un vrai désastre :snif2: , j'ai regarder l'exemple d'une IA bien réussi "Fog-IA2" mais comme je ne fait que débuter en programmation je ne comprend pas bien ou est le bon code pour les mouvements, je sais que sa marche avec des paths qui se dessine aléatoirement. Aider moi :p_svp:
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:55, édité 1 fois |
| | | mikmacer Utilisateur confirmé: Rang ***
Messages : 788 Localisation : Québec Projet Actuel : EscapeNgine
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 19:24 | |
| Tu pourrais regarder au niveau de l'algorthme du A* qui est implémenté dans GM. Je crois que l'utilisation de cet algo par des fonctions de GM est décrit dans la même page du manuel que mp_potential_step.
Il te faudrat spécifier un cadrier et lui indiquer les cases solid, et ceux non solid de ta map, et à partir de ça, tout objet pourra trouver un chemin du point A au point B partout dans ta map. |
| | | master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 19:34 | |
| T'as mis cette fonction dans step ou non ( mp_potential_step ) |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 19:37 | |
| c'est a dire que les objet solide il en a pas mal dans plein de map j'ai bien mis la commande dans le step de l'objet
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:55, édité 1 fois |
| | | master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 19:48 | |
| Alors comme MickMacer je pense qu'il faut drait que tu te tourne vers le A Star parce que la fonction mp_potential_step n'est pas assez personalisable à mon gout.. |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 20:28 | |
| :p_desole: mais sé quoi la A star ? :p_lol:
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:55, édité 1 fois |
| | | Rem_101 *Excellent utilisateur*
Messages : 4356 Localisation : chez votre marchand de journaux
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 20:57 | |
| Warning Patté - Spoiler:
[...]Les autres fonctions utilisent un mécanisme beaucoup plus complexe et sophistiqué via une approche basée sur les grilles (appelée parfois algorithme A*). Cette approche est plus efficace en terme de recherche de chemins (bien qu'elle puisse aussi échouer !) et détermine des chemins généralement plus courts mais nécessite davantage de travail de votre part. L'idée générale est la suivante. En premier lieu, nous plaçons une grille à l'endroit le plus approprié de la room. Vous pouvez choisir d'utiliser une grille avec un maillage fin (ce qui sera plus lent) ou une grille brute. Ensuite, pour tous les objets concernés, nous déterminons les cellules de la grille qui recouvrent les objets (en utilisant soit des boîtes de rebonds ou soit un contrôle précis) et marquons ces cellules comme étant interdites. Ainsi, une cellule sera marquée comme totalement interdite, même si elle recouvre partiellement un obstacle. Enfin, nous indiquerons une position de départ et une position cible (qui ne pourra être que parmi les cellules libres) puis la fonction déterminera par elle-même le chemin le plus court (le plus proche théoriquement du plus court) entre ces positions. Le chemin s'exécutera entre les centres des cellules libres. Ainsi, si les cellules sont suffisamment grandes de façon à ce que l'instance placée en son centre soit complétement à l'intérieur, le résultat sera concluant. Vous pourrez ensuite donner ce chemin à une instance pour qu'elle le suive.
L'approche basée sur les grilles est très puissante (elle est d'ailleurs utilisée dans de nombreux jeux professionels) mais demande de votre part une plus grande réflexion. Vous devrez déterminer quelle est la zone et la taille de cellule les mieux adaptées pour résoudre le problème. Vous devrez aussi déterminer quels objets doivent être évités et si une vérification précise est nécessaire pour effectuer ce travail. Tous ces paramètres auront une grande influence sur l'efficacité de cette approche.
En particulier, la taille des cellules est cruciale. Souvenez-vous que les cellules doivent être assez grandes de manière à ce que l'objet en déplacement et placé en son origine au centre d'une cellule, demeure complétement à l'intérieur de la cellule (soyez prudent en ce qui concerne la position de l'origine de l'objet. Pensez à décaler le chemin si l'origine de l'objet n'est pas bien au centre !) D'un autre côté, plus les cellules seront petites et plus il existera de chemins possibles. Si vous créez des cellules trop grandes, les ouvertures entre les obstacles pourront être fernées car toutes les cellules rentreront en intersection avec un obstacle.
Les fonctions actuelles concernant l'approche basée sur les grilles, sont les suivantes :
mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) Cette fonction crée la grille. Elle retourne un index qui devra être utilisé dans tous les autres appels. Vous pouvez créer et gérer plusieurs structures de grilles en même temps. left (gauche) et top (haut) indiquent la position du coin supérieur gauche de la grille. hcells et vcells indiquent le nombre de cellules horizontales et verticales. Enfin, cellwidth et cellheight indiquent la taille des cellules. mp_grid_destroy(id) Détruit la structure de la grille indiquée et libére la mémoire occupée. N'oubliez-pas d'appeler cette fonction si vous n'avez plus besoin de la structure. mp_grid_clear_all(id) Marque toutes les cellules de la grille comme libres. mp_grid_clear_cell(id,h,v) Efface la cellule indiquée. La cellule 0,0 correspond à la cellule en haut à gauche. mp_grid_clear_rectangle(id,left,top,right,bottom) Efface toutes les cellules qui sont en intersection avec le rectangle indiqué (dans les coordonnées de la room). mp_grid_add_cell(id,h,v) Marque les cellules indiquées comme étant interdites. La cellule 0,0 correspond à la cellule en haut à gauche. mp_grid_add_rectangle(id,left,top,right,bottom) Marque toutes les cellules qui sont en intersection avec le rectangle indiqué comme étant interdites. mp_grid_add_instances(id,obj,prec) Marque toutes les cellules qui sont en intersection avec une instance d'un objet donné comme êtant interdites. Vous pouvez également utiliser une instance individuelle en donnant à obj l'ID de l'instance. Vous pouvez aussi employer le mot-clé all pour indiquer toutes les instances de tous les objets. prec indique si l'on doit utiliser une vérification précise dans les collisions (ne fonctionnera que si le paramètre contrôle précis a été coché pour le sprite utilisé par l'instance). mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) Détermine un chemin à l'aide de la grille. path doit mentionner un chemin existant qui sera remplacé par le chemin calculé par l'ordinateur. xstart et ystart indiquent le début du chemin et xgoal et ygoal la cible. allowdiag indique si les mouvements en diagonal sont autorisés au lieu de ne considérer que ceux horizontaux ou verticaux. La fonction retourne si elle a réussi à déterminer un chemin (veuillez noter que le chemin est indépendant de l'instance courante; c'est un chemin calculé dans la grille et non pas un chemin pour une instance particulière). mp_grid_draw(id) Cette fonction dessine la grille avec les cellules libres de couleur verte et les cellules interdites en rouge. Cette fonction est assez lente et n'est généralement utilisée que dans les outils de déboguage.
|
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 21:38 | |
| Je vais étudier sa de plus prêt ça a l'aire quand même compliquer
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:56, édité 1 fois |
| | | master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: IA Simple de déplacement Dim 20 Juil 2008 - 23:37 | |
| |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 1:39 | |
| énorme merci je vais essayer de plus vous embêter et de faire avec
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:54, édité 1 fois |
| | | Rem_101 *Excellent utilisateur*
Messages : 4356 Localisation : chez votre marchand de journaux
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 11:28 | |
| LoL master qui est plus claire que moi avec un seul lien que moi avec un texte :'( |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 15:25 | |
| Je crois qu'il y a un petit problème dans cet exemple, je ne peut pas l'adapter dans mon jeu. tous dabor j'ai mis les scripte dans mon jeu (rien de compliquer) j'ai reprogrammer mes objets pour que l'objet player sois le zombie et qu'il suive l'objet "perso" qui était avant la souris. rien de compliquer mais quand je lance le jeux : ___________________________________________ ERROR in action number 1 of Create Event for object objObstacle: In script AStar_setBlocked: Error in code at line 1: // Arguments:// 0 - x// 1 - y// 2 - 0...Free, 1...Blocked//// Returns: nothingwith (objPathFinder) { if (coordMode) ds_map_replace(cells[argument0,argument1],"blocked",argument2); else ds_map_replace(cells[floor((argument0-X_OFFSET)/CELL_WIDTH), floor((argument1-Y_OFFSET)/CELL_HEIGHT)], "blocked",argument2);} at position 232: Unknown variable cells or array index out of bounds ------------------------------------------------------------------------------------- sa me l'achiffe 3 foi (je fait ignorer) mais aprés quand je sort de la zone du départ (je pensse) ____________________________________________________________ ERROR in action number 1 of Mouse Event for Glob Left Pressed for object objPlayer: In script AStar_findPath: Error in code at line 1: // Arguments:// 0 - x1// 1 - y1// 2 - x2// 3 - y2// 4 - center (true/false)//// Returns:// path id if successful, -1 if unsuccessfulwith (objPathFinder) {var startNode,goalNode,openList,closedList,node,neighbors,i,neighborNode, isOpen,isClosed,costFromStart;if (coordMode) { startNode = cells[argument0,argument1]; goalNode = cells[argument2,argument3]; argument0 = argument0 * CELL_WIDTH + X_OFFSET; argument1 = argument1 * CELL_HEIGHT + Y_OFFSET;} else { startNode = cells[floor((argument0-X_OFFSET)/CELL_WIDTH), floor((argument1-Y_OFFSET)/CELL_HEIGHT)]; goalNode = cells[floor((argument2-X_OFFSET)/CELL_WIDTH), floor((argument3-Y_OFFSET)/CELL_HEIGHT)];}if (ds_map_find_value(goalNode,"blocked")) return -1;openList = ds_priority_create();closedList = ds_list_create();ds_map_replace(startNode,"costFromStart",0);ds_map_replace(startNode,"estimatedCostToGoal",AStar_getEstimatedCost(startNode,goalNode));ds_map_replace(startNode,"pathParent",-1);ds_priority_add(openList,startNode,ds_map_find_value(startNode,"costFromStart")+ds_map_find_value(startNode,"estimatedCostToGoal"));while (!ds_priority_empty(openList)) { node = ds_priority_delete_min(openList); if (node == goalNode) { ds_priority_destroy(openList); ds_list_destroy(closedList); return AStar_constructPath(goalNode,argument0,argument1,argument4); } neighbors = AStar_getNeighbors(node); for (i=0; i<ds_list_size(neighbors); i+=1) { neighborNode = ds_list_find_value(neighbors,i); if (ds_priority_find_priority(openList,neighborNode) > 0) isOpen = 1; else isOpen = 0; if (ds_list_find_index(closedList,neighborNode) > -1) isClosed = 1; else isClosed = 0; costFromStart = ds_map_find_value(node,"costFromStart") + AStar_getCost(node,neighborNode); if ((!isOpen && !isClosed) || (costFromStart < ds_map_find_value(neighborNode,"costFromStart"))) { ds_map_replace(neighborNode,"pathParent",node); ds_map_replace(neighborNode,"costFromStart",costFromStart); ds_map_replace(neighborNode,"estimatedCostToGoal", AStar_getEstimatedCost(neighborNode,goalNode)); if (isClosed) ds_list_delete(closedList,ds_list_find_index(closedList,neighborNode)); if (!isOpen) { ds_priority_add(openList,neighborNode,ds_map_find_value(neighborNode,"costFromStart") +ds_map_find_value(neighborNode,"estimatedCostToGoal")); } } } ds_list_destroy(neighbors); ds_list_add(closedList,node);}ds_priority_destroy(openList);ds_list_destroy(closedList);return -1;} at position 628: Unknown variable cells or array index out of bounds ------------------------------------------------------------------------------------ de plus mes objets qui était parent du mur on disparu voila
Dernière édition par dimitrou le Lun 21 Juil 2008 - 23:54, édité 1 fois |
| | | edi9999 Utilisateur confirmé: Rang *****
Messages : 2480 Localisation : France Projet Actuel : theatre flashy
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 17:05 | |
| tu as surement oublie d'initialiser un des scripts. |
| | | nicoulas *Excellent utilisateur*
Messages : 6030 Localisation : Dordogne Projet Actuel : Croustaface Tower Defense
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 17:07 | |
| cette erreur survient soit quand une variable est manquante, soit quand il y a un problème avec une valeur trop basse ou trop élevée dans les ds_list |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Lun 21 Juil 2008 - 20:42 | |
| c'est bisar j'ai bien remis tous se qu'il y avait |
| | | nicoulas *Excellent utilisateur*
Messages : 6030 Localisation : Dordogne Projet Actuel : Croustaface Tower Defense
| Sujet: Re: IA Simple de déplacement Mar 22 Juil 2008 - 0:59 | |
| je sais pas, peut être que trop d'objets sont pris en compte (plus que dans l'exemple peut être ?) |
| | | Frugalware Très bonne participation
Messages : 160 Projet Actuel : Zombad
| Sujet: Re: IA Simple de déplacement Mar 22 Juil 2008 - 12:11 | |
| non j'ai mis le même nombre d'objet |
| | | Contenu sponsorisé
| Sujet: Re: IA Simple de déplacement | |
| |
| | | | IA Simple de déplacement | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |