Home Tutorials Download Beta Store Forum Documentation KnowledgeBase Wiki Blog

ShiVa3D

Return to Game programming

Récupérer une variable d'une AIM depuis une autre

All about the StoneScript

Récupérer une variable d'une AIM depuis une autre

Postby berdal84 » 14 Nov 2007, 18:42

Bonjour,

J'ai un petit soucis dans mon superBatailleDeChars:

J'ai voulu optimiser la partie "recherche de char ennemi" de l'IAM de mes chars, en effet les getFirstHitCollision et getFirstHitSensor étant assez lourd en calcul, j'ai voulu limiter ces opérations: en effet, si aucun char ennemi ne se trouve assez proche pour etre détecté par les getFirst.. (limités à une certaine distance), je ne lance pas du tout de cycle de recherche. Mais pour cela je dois récupérer la liste des chars et pour chaque, regarder s'il est assez proche pour etre repéré éventuellement par mon "cycle de recherche" et auquel cas lancer le cycle de recherche (projection de plusieurs rayons autour du char..)

Je souhaiterai donc récupérer, depuis l'AI Model d'un des objets de ma scene ( un char ), une variable : "tListeDesCharsDansLaScene" ( une liste d'objets ), qui est contenue dans une de mes user AI que j'ai nommée "AI_Main".


Mon problème est que les handlers ne renvoient pas de valeurs comme je l'espérais :

local tListeDesChars = user.sendEvent ( this.getUser(), "AI_Main", "onDonneMoiLaListeDesChars")


Quelqu'un a-t-il une idée ?
My Games : https://play.google.com/store/apps/developer?id=B%C3%A9renger%20DALLE-CORT&hl=fr
User avatar
berdal84
Platinum Boarder
Platinum Boarder
 
Posts: 671

Re:Récupérer une variable d'une AIM depuis une autre

Postby pingu » 14 Nov 2007, 19:20

Oui, j'ai été confronté au même problème. Je vois deux solutions :

_1 :

- tu envoies ton message de l'objet au main avec en paramètre la référence vers l'objet (this.getobject())
- sur le message qui réceptionne ça, dans ton main_ai, tu renvoies un message à l'objet (dont tu as le handler passé en paramètre) avec en paramètre ton tableau de liste de chars.
- le message qui réceptionne ça dans l'objet, tu as ta liste de chars pour faire tes tests.

tu remarqueras que cette solution fait intervenir bcp de messages... moi j'ai fait autrement au final :

_2 :

- tous mes ennemis sont créés (dynamiquement) en temps que fils d'un dummy que j'ai placé dans ma scène, dummy auquel j'ai donné un tag.
- et dans mon script où je veux tester si un ennemi est dans la zone de tir (pour des tourelles dans mon cas), je fais juste un

local nCount = group.getSubObjectCount ( hDum )

for i=0,nCount-1 do

local hCible = group.getSubObjectAt ( hDum, i )

if(hCible ~= nil) then

local nDistance = object.getDistanceToObject ( hThis, hCible )

if(nDistance < this.nPortee ( ))then

-- objet à portée de tir
end
end

end


(j'ai pas mis tout mon code spécifique)

Je pense que cette méthode est meilleure, plus "objet" dans l'idée.

Logiquement, si tu es dans le même cas que moi, avec un getdistancetoobject, tu n'as pas besoin de lancer de rayon ni de sensor, tu as juste besoin de savoir si un char rentre dans la zone de l'autre.

Voilà, j'espère que ça a pu t'aider, je sais pas si c'est très clair...

Je ne sais pas si d'autres sont d'accords avec moi, mais on devrait pouvoir accéder aux variables d'un objet directement à partir de son handle, non ? (si vous me dites qu'on peut déjà, je peux jeter 3/4 du code que j'ai fait... mais je le ferais avec plaisir :laugh: )
pingu
Senior Boarder
Senior Boarder
 
Posts: 59

Re:Récupérer une variable d'une AIM depuis une aut

Postby philip » 14 Nov 2007, 19:46

Les propositions de Pingu sont excellentes!

Créer une hiérarchie d'objet est parfait et me semble être aussi la solution idéale!

Il y a aussi, bien sur, l'utilisation des 'callbacks', c'est à dire l'utilisation de handlers en aller/retour pour obtenir les informations désirées.

Mais il y a une autre possibilité, celle d'utiliser les variables d'environnements.

En effet, ces variables de type basiques (booléen, nombre, string) uniquement (donc pas d'objet...) n'appartiennent pas à une AIModel mais au user, elles sont donc accessible depuis n'importe quelle AIModel.

Les variables d'environnement ont bien d'autre capacités et usages, comme être sérialisable et envoyable sur le réseau ou encore écrite dans un fichier, mais elles résolvent également le problème des type de variables 'statique', pour ceux qui aime les langages objets :-)
[edit]
on ne peut pas avoir accès ni en lecture ni en ecriture des variables d'AIModel depuis le handle (on y bcp bcp bcp bcp bcp pensé...) pour des raisons simples de sécurité et de segmentation du code. certes ça oblige a quelque contorsion de code, mais ca permet de mieux conceptualiser son développement, de le segmenter et donc d'en augmenter l'efficacité et la productivité.
En gros, quand on développe en objet, on crée des accesseurs pour gérer sécuriser ses variables, ben ici c'est pareil...
Enfin, cela permet également d'avoir une vision de la conception comme si le moteur et les AIModels gèrent des signaux, des évènements, des impulsions.
Finalement un système nerveux de signaux dont les AIModels sont des redirecteurs avec traitement intelligent, émis par l'utilisateur ou le noyau.
Bon j'irai pas plus loin sinon on va me traiter de foufou du code LOL.
[/edit]

Phil.<br><br>Message édité par : philip, à : 14-11-2007 à 20:52
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:Récupérer une variable d'une AIM depuis une aut

Postby berdal84 » 14 Nov 2007, 19:57

Merci pingu pour ta réponse rapide ;)

En fait je pense que je vais utiliser ton systeme de lien avec un dummy.


Logiquement, si tu es dans le même cas que moi, avec un getdistancetoobject, tu n'as pas besoin de lancer de rayon ni de sensor, tu as juste besoin de savoir si un char rentre dans la zone de l'autre.


Tu as raison, actuellement mes chars font des lancés de rayons au pif pour trouver un ennemi... très long... c'est pourquoi je vais utiliser ta technique et ne lancer des rayons qu'en direction des chars proches et pas au pif autour du char. Car j'ai besoin de lancer des rayons pour savoir si les objets proches sont cachés par un mur (collider) ou pas.



Autre solution peut etre possible, après avoir un peu plus fouillé:

J'ai vu qu'on pouvait avoir la liste des objets de la scene, il suffit de ne garder dans cette liste que les meshes et ensuite d'éliminer tous ceux qui donnt le model porte un nom différent de: "Enm" ( nom du model de mes ennemis), mais j'ai des soucis pour y arriver, je sais pas si ça va marcher.

Edit, exemple pour savoir le nombre de sensor que contient la scene (simple idée, ne fonctionne pas):

Code: Select all
   local s = application.getCurrentUserScene ( )
   local nObjectCount = scene.getObjectCount ( s )
   
   
    local nSensorCount = 0
   
    for i=0, nObjectCount-1, 1
    do

        local hObject = scene.getObjectAt ( s, i )
        local bYes = object.isKindOf ( hObject, object.kTypeSensor )
       
        if ( bYes )
        then
            nSensorCount = nSensorCount + 1
        end
    end
   
    log.message ( "Nombre d'objects dans la scene : ".. nObjectCount )
    log.message ( "Nombre de sensors dans la scene : ".. nSensorCount )



Bye ;)<br><br>Message édité par : berdal84, à : 14-11-2007 à 21:02
My Games : https://play.google.com/store/apps/developer?id=B%C3%A9renger%20DALLE-CORT&hl=fr
User avatar
berdal84
Platinum Boarder
Platinum Boarder
 
Posts: 671

Re:Récupérer une variable d'une AIM depuis une aut

Postby philip » 14 Nov 2007, 20:07

Dans ton cas, je vois 2 possibilités, dépendant de la création de ta map de jeu.

Soit tes chars sont déja dans la scène au démarrage, c'est à dire que tu les as placés dans le scene viewer, sauvé ta scene ainsi et démarre ton jeu en l'état.
Alors dans ce cas, il te suffit de tagguer tes chars ennemis, puis de les récupérer avec leur nom via un scene.getTaggedObjet( taScene, 'leNomDuChar' )

Soit tu crée dynamiquement tes chars au démarrage de ton jeu, ce qui induit que tu as le handle sur les objets que tu crée en dynamique:
local myChar = scene.createRuntimeEtc.

Auquel cas, tu peux les stocker dans l'AIModel qui crée les chars dans un tableau.

Finalement, c'est plus une question de conception que de fonctionnalité...

Good development
philip
Platinum Boarder
Platinum Boarder
 
Posts: 619

Re:Récupérer une variable d'une AIM depuis une aut

Postby pingu » 15 Nov 2007, 10:49

(à noter que l'astuce du dummy m'a été astucieusement conseillée par l'ami Jami, qui travaille avec moi... Je voudrais pas m'attribuer ses bonnes idées :))

on ne peut pas avoir accès ni en lecture ni en ecriture des variables d'AIModel depuis le handle (on y bcp bcp bcp bcp bcp pensé...) pour des raisons simples de sécurité et de segmentation du code. certes ça oblige a quelque contorsion de code, mais ca permet de mieux conceptualiser son développement, de le segmenter et donc d'en augmenter l'efficacité et la productivité.



Effectivement, je comprends votre façon de penser, c'est juste un peu déroutant pour moi qui n'ait pas l'habitude. Mais c'est vrai que c'est excitant de devoir repenser plus intelligemment son code et les interactions entre ses objets. Ca me rappelle mes vieux souvenirs de Merise :)
pingu
Senior Boarder
Senior Boarder
 
Posts: 59

Re:Récupérer une variable d'une AIM depuis une autre

Postby pataya » 21 Nov 2007, 20:09

j'ai une variables d'environnements booléen je voudrais récupéré la condition false ou true dans 2 object différent
if (this.COLLI ( ) == true) then
il me dis
[+ Alerte ] {Scripting }AI Runtime error : [string "flam_Handler_onSensorCollision"]:11: attempt to call field `COLLI' (a nil value)

la variables d'environnements ce définie comme les autre variable avec un this.variable?
Shiva can do hit!
User avatar
pataya
Platinum Boarder
Platinum Boarder
 
Posts: 876

Re:Récupérer une variable d'une AIM depuis une aut

Postby NiCoX » 21 Nov 2007, 21:45

Les variables d'environnement ne se déclarent pas :

Code: Select all
application.setCurrentUserEnvironmentVariable ( "test", true )

...

local b  = application.getCurrentUserEnvironmentVariable ( "test" )
if (  b ~= nil )
then
    log.message ( "la variable test vaut : ", b )
else
    log.message ( "la variable test n est pas définie" )
end
User avatar
NiCoX
Platinum Boarder
Platinum Boarder
 
Posts: 5627
Location: France

Re:Récupérer une variable d'une AIM depuis une autre

Postby pataya » 22 Nov 2007, 17:45

Bonjour en fait je lutte sur un truc tout simple
j'espèré pourvoir le réglé avec une variable d'environement

apres qq test ca a pas l'air de le faire (;-

voila j'ai un 3 object sensor le vaisseau les missiles et les ennemis
les missiles doivent détruire les ennemis mais pas l'avion
j'ai un sensor sur l'ennemis qui détruit l'object si il touchez
un sensor dans les missiles ou je voudrais envoyer une variable booléen a l'ennemi
si entre en collision
j'ai donc essayé avec une variable environement !

je continue
Shiva can do hit!
User avatar
pataya
Platinum Boarder
Platinum Boarder
 
Posts: 876

Re:Récupérer une variable d'une AIM depuis une aut

Postby berdal84 » 22 Nov 2007, 17:57

Salut pataya,

Ne te complique pas la vie pour rien, les sensors peuvent avoir un ID, ce qui permet de les classifier selon tes propres nécessitées:

Exemple:

id = 1 correspondra au vaisseau
id = 2 correspondra au missiles
id = 3 correspondra aux ennemis

Du coup il te sera très aisé de savoir quelle catégorie touche quelle autre, voici un exemple de code pour le onSensorCollision d'un missile:

Code: Select all
function Missile.onSensorCollision ( nSensorID, hTargetObject, nTargetSensorID )
--------------------------------------------------------------------------------

    if (nTargetSensorID == 1)
then
   
    log.message (" Le missile touche le vaisseau"«»)

elseif(nTargetSensorID == 2)

     log.message (" Le missile touche un autre missile"«»)

elseif(nTargetSensorID == 3)

     log.message (" Le missile touche un ennemi"«»)

end



Voila, j'espère que ça t'aidera, et que j'ai expliqué clairement.

Bye
My Games : https://play.google.com/store/apps/developer?id=B%C3%A9renger%20DALLE-CORT&hl=fr
User avatar
berdal84
Platinum Boarder
Platinum Boarder
 
Posts: 671


Return to Game programming