 | Forum Le CBNA Le Forum du CBNA a pour but de vous aider dans l'utilisation de GameMaker. Premier forum Francophone sous GameMaker, vous trouverez des .gmd, .gm6, .gmk, scripts, logiciels et d'autres ressources sur Le CBNA. |
| | |
| Auteur | Message |
|---|
dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | Sujet: IA Simple de déplacement Dim 20 Juil - 18: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 est un vrai désastre , 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  _________________ Mon Projet "zombad"

http://cbna.forumactif.com/vos-projets-f11/zombad-t7975.htm
40%

Dernière édition par dimitrou le Lun 21 Juil - 22:55, édité 1 fois |
|  | | mikmacer Utilisateur confirmé: Rang ***

Age : 20 Inscrit le : 24 Déc 2005 Messages : 778 Localisation : Québec : ────────── : Projet Actuel : EscapeNgine Avancement :
   (50/100)
 | Sujet: Re: IA Simple de déplacement Dim 20 Juil - 18: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 *****

Age : 16 Inscrit le : 16 Nov 2006 Messages : 1621 Localisation : Bruxelles, Belgique @ You Night Club : ────────── : Projet Actuel : PacWars Avancement :
   (35/100)
 | Sujet: Re: IA Simple de déplacement Dim 20 Juil - 18:34 | |
| | T'as mis cette fonction dans step ou non ( mp_potential_step ) |
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | Sujet: Re: IA Simple de déplacement Dim 20 Juil - 18: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 _________________ Mon Projet "zombad"

http://cbna.forumactif.com/vos-projets-f11/zombad-t7975.htm
40%

Dernière édition par dimitrou le Lun 21 Juil - 22:55, édité 1 fois |
|  | | master47 Utilisateur confirmé: Rang *****

Age : 16 Inscrit le : 16 Nov 2006 Messages : 1621 Localisation : Bruxelles, Belgique @ You Night Club : ────────── : Projet Actuel : PacWars Avancement :
   (35/100)
 | Sujet: Re: IA Simple de déplacement Dim 20 Juil - 18: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.. |
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | |  | | Rem_101 *Excellent utilisateur*

Age : 16 Inscrit le : 11 Jan 2006 Messages : 3396 Localisation : chez votre marchand de journaux : ────────── : Avancement :
  (0/100)
 | Sujet: Re: IA Simple de déplacement Dim 20 Juil - 19: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.
|
_________________
 |
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | |  | | master47 Utilisateur confirmé: Rang *****

Age : 16 Inscrit le : 16 Nov 2006 Messages : 1621 Localisation : Bruxelles, Belgique @ You Night Club : ────────── : Projet Actuel : PacWars Avancement :
   (35/100)
 | |  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | |  | | Rem_101 *Excellent utilisateur*

Age : 16 Inscrit le : 11 Jan 2006 Messages : 3396 Localisation : chez votre marchand de journaux : ────────── : Avancement :
  (0/100)
 | Sujet: Re: IA Simple de déplacement Lun 21 Juil - 10:28 | |
| LoL master qui est plus claire que moi avec un seul lien que moi avec un texte :'( _________________
 |
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | Sujet: Re: IA Simple de déplacement Lun 21 Juil - 14: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 _________________ Mon Projet "zombad"

http://cbna.forumactif.com/vos-projets-f11/zombad-t7975.htm
40%

Dernière édition par dimitrou le Lun 21 Juil - 22:54, édité 1 fois |
|  | | edi9999 Utilisateur confirmé: Rang *****

Age : 16 Inscrit le : 27 Jan 2006 Messages : 2219 Localisation : partout et nulle part : ────────── : Projet Actuel : un mario rigolo et theatre flashy Avancement :
   (25/100)
 | |  | | nicoulas Utilisateur confirmé: Rang *****

Age : 15 Inscrit le : 16 Juin 2007 Messages : 2944 Localisation : Aquitaine -> Dordogne : ────────── : Projet Actuel : croustaface Avancement :
  (100/100)
 | Sujet: Re: IA Simple de déplacement Lun 21 Juil - 16: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 _________________
|
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | |  | | nicoulas Utilisateur confirmé: Rang *****

Age : 15 Inscrit le : 16 Juin 2007 Messages : 2944 Localisation : Aquitaine -> Dordogne : ────────── : Projet Actuel : croustaface Avancement :
  (100/100)
 | Sujet: Re: IA Simple de déplacement Lun 21 Juil - 23:59 | |
| je sais pas, peut être que trop d'objets sont pris en compte (plus que dans l'exemple peut être ?) _________________
|
|  | | dimitrou Très bonne participation

Age : 15 Inscrit le : 05 Jan 2008 Messages : 120 Localisation : 34 (Montpellier, Hérault) : ────────── : Projet Actuel : Zombad Avancement :
   (40/100)
 | |  | | |
| Page 1 sur 1 |
| | Permission de ce forum: | Vous pouvez répondre aux sujets dans ce forum
| |
| |
| |
|