#0 

06-07-2007 15:02:42

aenahel
Petit nouveau
Date d'inscription: 05-06-2007
Messages: 8

Coucou tout le monde. Pour mon FPS que je suis en train de développer, il me faut absolument des bots. Des persos (md2) qui bougent, se déplacent tout seul, et qui foncent tapper sur le joueur dès qu'ils le voient. Voilà, assez simple à expliquer en toute rigueur, mais alors pour faire un truc dans le genre... -_-

En gros, je galère. Je vais vous dire ou j'en suis dans mes recherches mais si vous pouvez m'éviter de pédaler dans la semoule ca pourrait etre classe ^^ (ca se trouve, il existe du code déjà fait à utiliser pour faire des bots...).

Ce que je souhaite faire, c'est utiliser un ICameraSceneNode (pour utiliser des trucs cools comme par exemple getSceneNodeFromCameraBB(camera)wink et lui attacher un IAnimatedSceneNode (pour le mesh). Après, je pourrais m'arranger pour coder un déplacement, qui se ferait à chaque loop (donc je ferais gaffe que ca n'aille pas trop vite), m'arranger pour qu'il y ait un statut (du genre "en train de faire une ronde en marchant par la" ou "en train de poursuivre le joueur" ou encore "en train de taper sur le joueur"), et... voila. Mais j'y arrive pas TT.

Donc voila, au secours, si vous aviez une quelconque idée comment me tirer d'affaire...


merci ! ^^

Hors ligne


#1 

06-07-2007 15:44:55

Aranoth
Abonné
Lieu: Toulouse
Date d'inscription: 25-09-2006
Messages: 242
Site web

Tu veux employer une caméra pour chaque bot de façon à détecter le joueur ?

C'est une très mauvaise idée.

Tu as juste à tester la distance entre le bot et le joueur à chaque frame, si ils sont proches, le bot passe en mode "en train de poursuivre le joueur", et voilà.

C'est assez sommaire, mais c'est facile à mettre en place.

Hors ligne


#2 

06-07-2007 17:22:14

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Tu as juste à tester la distance entre le bot et le joueur à chaque frame, si ils sont proches, le bot passe en mode "en train de poursuivre le joueur", et voilà.


J'ai encore jamais fait d'IA, mais ca me semble être une bonne idée de départ. Après je penses qu'il faut l'affiner. Quelques idées qui me viennent :

- initialiser l'ennemi dans un état "n'a pas encore détecté le joueur"
- à chaque pas de boucle :
  - si l'état est "n'a pas encore détecté le joueur" :
     - tester la distance entre le joueur et l'ennemi
         - si la distance est petite, on vérifie qu'il n'y a pas de murs entre eux (ben oui, il voit sans doute pas a travers les murs smile )
            - si on arrive la, l'ennemi passe dans l'état "poursuit le joueur"
  - si l'état est "poursuit le joueur" :
     - si l'ennemi peut tirer sur le joueur (pas de murs, distance raisonnable...), il tire (logique... big_smile)
     - sinon, il faut qu'il se déplace pour être plus prêt du joueur
...

Pour le déplacement de l'ennemi, le mieux est sans doute de créer un réseau en placant des points de passages possibles un peu partout sur ta map, puis d'utiliser l'algorithme A* pour trouver un bon chemin (pleins d'infos sur cet algo sur le web, tu peux utiliser micropather pour ca).

Voila, j'espère que ca va t'aider a démarrer, mais y a encore beaucoup de boulot  à faire... wink

Hors ligne


#3 

06-07-2007 20:25:48

aenahel
Petit nouveau
Date d'inscription: 05-06-2007
Messages: 8

Le truc c'est que si je base la réaction du bot en testant la distance bot-player, le gobelin qui sera de dos remarquera ma presence a la meme distance que s'il est de face et qu'il me "voit" arriver. Et pour les déplacements, faut que je me retappe toute la programmation qui a servie a ICameraSceneNodeFPS (avancer, tourner, strafe etc etc), et c'est pour ca que je voulais réutiliser ca... (avec un setActiveCamera(camera_du_joueur) pour pas de confusions avec les cameras bots).

En fait, il s'agit de déplacer un gobelin qui n'est pas armé ( -> en fait, s'il nous voit, il nous saute dessus et nous tappe sur la figure).

Donc je pensais à un etat "cherche" ou "ne se doute de rien" (ca dépend de mon humeur ^^), ou il peut marcher par-ci par-là, et puis s'il nous voit (genre à 50m en terrain dégagé) ou quand on approche a plus de 2m sans qu'il nous voit (on fait quand meme du bruit en marchant...) il nous attaque, c'est-a-dire qu'il cours vers nous, ou qu'il nous cherche s'il nous voit plus (et au contact, il tappe).

Le coup de l'algo A* m'a l'air interessant (quoique compliqué et peut être remplaçable par une autre méthode), je vais y jeter un oeil. Mais en fait, pour déplacer les IAnimatedSceneNode (vu que je fais plus de camera), les déplacer à chaque loop d'un pixel avec un ->setPosition(truc) en utilisant une 3dline entre le joueur et le bot (et encore, ca je sais pas faire pour l'instant), c'est pas un peu bourrain au niveau de la programmation ?

Moi ce qui m'arrangerait, ce serait un code téléchargeable pour les bots ^^ mais je dois surement rever pour vouloir trouver ca...

Dernière modification par aenahel (06-07-2007 20:29:20)

Hors ligne


#4 

06-07-2007 21:13:28

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

Hehe effectivement là tu rêves, si tu veux de l'ia tu te la programmes c'est comme ça que ça marche big_smile.
Sinon une IA peut également prendre en compte le FOV (Field Of View en fr ça donne Champ de vision) du personnage, ça te permet de faire un test sur la distance et le champ de vision pour déclencher un évenement de ton IA.
@+


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#5 

07-07-2007 00:07:31

Eagle4
Membre
Date d'inscription: 19-10-2006
Messages: 18

alala les IA c'est quelque chose qui peut etre très très compliqué ^^
mais en général ca marche comme ca :
- Au début ton ennemi est super con, il avance tout droit.
- Ensuite tu lui donne des points à rechercher, par exemple pour une ronde ou bien toi. pour cela le mieux est un pathfinding s'il te vois ou s'il retourne dans son chemin de ronde qui lui est prédéfinis.
- Pour trouver les points, il faut ce que l'on appel une line of sight, en gros ca permet de determiner si un ennemi vois l'adversaire. si on utilise un simple calcul de distance alors l'ennemi nous trouvera dans son dos ET aussi à travers les murs O_o.
Je ne sais pas comment faire le LOF en C++, moi j'utilise un petit masque qui va vers le joeuur en ligne droite et qui est détruit si il touche un mur, si il touche le joueur alors il peut le voir. j'utilise un cone également pour représenter la vision de l'ennemi et en plus du masque, le joueur dois etre dans le cone (du coup il vois pas derrière), evidement c'est une très mauvaise solution et il dois bien sur y avoir de meilleurs moyens de le faire en C++.
- La distance peut etre utilisé pour les oreilles de l'ennemi. L'ennemi peut entendre le joueur arriver en courant mais peut etre pas en marchant wink
- Ensuite tu peut découper ta map avec emplacement plus ou moins couvert et ordonner à l'ennemi de s'y abriter s'il te vois pour te tirer desssu (mais bon là apparement ce n'est pas ton cas)

Enfin bref pour finir, oublie pas la Line of sight google te permettra surement d'en trouver des algos qui te convienent wink

Hors ligne


#6 

07-07-2007 00:19:22

gp2mv3
Abonné
Date d'inscription: 27-06-2007
Messages: 103
Site web

Il me faudrait un truc similaire.
Si tu as une réponse concluante ce serait simpa de me prévenir.
De mon coté je cherche une solution sur papier que je reprogrammes comme je peux.

Merci d'avance.

Gp2mv3


Mon projet sous Irrlicht : RoM : Rebuilding on Mars
N'hésitez pas à y faire un tour wink

Hors ligne


#7 

07-07-2007 00:36:28

gp2mv3
Abonné
Date d'inscription: 27-06-2007
Messages: 103
Site web

Voila j'ai la solution sur papier mais en prog il faudra longtemps. wink

Gp2mv3


Mon projet sous Irrlicht : RoM : Rebuilding on Mars
N'hésitez pas à y faire un tour wink

Hors ligne


#8 

07-07-2007 13:00:20

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

J'ai presque fini ma lib de pathfinding A* je la posterai d'içi 1 - 2 semaines grand maximum le temps de fignoler quelques trucs. Donc si ça t'intéresse...

@ Perceval : je connaissais pas micropather, mais en fait ca se rapproche pas mal de se que je fais. A part que ça supporte apparemment pas les graphes 3D


Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250

Hors ligne


#9 

08-07-2007 10:56:21

firnafin
Abonné
Date d'inscription: 31-03-2007
Messages: 150

salut,

De retour de vacance il a une tonne de new topic , je commence par celui la car l'ia c'est une passion.
Donc deja comme tous l'on plus ou moins dit l'idée de camera est tres mauvaise car elle consomera enormement de ressource et cela juste pour eviter de programmer une fonction "move" et "trun" ( qui sont tres simple a faire en 2D comme ici pour le FPS qui est groso-modo du 2D ) c'est domage.
Pour la "vision" c'est tres simple il y a une merveille mathematique qui la chose la plus utilise en multi-dimension c'est .... LE PRODUIT SCALAIRE , et oui tres pratique pas groumand , bref genial , Pourquoi ?

un premier vecteur : position perso-position perso
un second vecteur  : où regarde le bot ( tete ou corps selon si il bouge la tete ou pas )

produit scalaire des deux = norme de l'un * norme de l'autre * COS( angle entre  les vecteurs )
( notation =  <.|.> ou (.|.) )
( dotProduct  pour irrlicht, a voir ds la doc )

donc en gros si tu travaille ac des vecteurs normlisés sa te donne une valeur entre -1 et 1 ou :

1=en face
0=Pi rad
-1=derrier

donc au finale ca donne le cone de l'aigle (Eagle4 parle de LOF ) avec un simple teste du style if( (v1|v2)<0.5 ) ...
qui se traduit par si le joueur est des le champ de vision du bot qui est un cone a PI/4 rad d'angle .


Si ta map est simple tu fais un gros cadrillage pour les testes des murs sinon tu fait ca avec un systeme de collision
Pour les deplacements le plus simple comme tous l'on dit aussi c'est un pathfinding  ( A*, Dijkstra en n*log(n) donc faible consomation CPU ).
ton ia est fini ( la plus basique qui soit mais qui marche et peut faire une base evolutive  )
Pour l'aspect modulable de  l'ia ( tu parle de dl une ia ) fait le en script ( LUA par exemple ) tu y perds en performence mais si c'est bien codé cela reste raisonnable.

Voila j'espere que ca t'aidera un peut

Hors ligne


#10 

08-07-2007 11:29:40

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Génial smile !
Je pensais pas que ce test était aussi simple et rapide que çà. Un grand merci pour cette précision big_smile

Hors ligne


#11 

08-07-2007 13:25:17

Aranoth
Abonné
Lieu: Toulouse
Date d'inscription: 25-09-2006
Messages: 242
Site web

Pour les collisions, tu peux après avoir détecté le joueur lancer un rayon du bot jusqu'au joueur et tester si il est en collision avec la map.

Si oui, le joueur n'est pas visible et est de l'autre côté d'un mur ou planqué derrière une caisse.

Hors ligne


#12 

08-07-2007 20:03:35

gp2mv3
Abonné
Date d'inscription: 27-06-2007
Messages: 103
Site web

Bon bah je crois que je vais arreter de me casserr la tete alors et passer à cette solution. wink

Merci en tout cas.

Gp2mv3


Mon projet sous Irrlicht : RoM : Rebuilding on Mars
N'hésitez pas à y faire un tour wink

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
28 invités en ligne
Aucun membre connecté
RSS Feed