La
variable "self" (COD
et CODUO)
ou comment économiser des lignes de script.
Tutorial créé par Tropheus inspiré du tutorial de Bushman sur le déplacement des AI.
Dans l'exemple proposé vous pourrez comprendre l'intérêt d'utiliser la variable "self". Il s'agit en fait de script le même déplacement mais de deux façons différentes.
1/ Mapping
Ici rien de spécial, une map comme d'habitude avec 2 actors américains et
2 actors russes afin de bien voir les différents mouvements.
Les américains ont pour targtename us_1 et us_2
Les russes ont pour targtename russe_1 et russe_2
Vous ajouterez 2 trigger_multiple un pour le mouvement des américains, l'autre pour le mouvement des russes avec les targetnames respectifs trigg_us et trigg_russe.
Vous ajouterez aussi 2 node_concealment_stand (ou autre chose) un comme objectif du déplacement des américains, l'autre pour celui des russes avec respectivement les targetnames suivants : node_us et node_russe.
N'oubliez pas les node_pathnode pour mener vos soldats jusqu'à leur objectif.
Voici ce que cela donne au final.

2/ Scripting
Grace au script nous allons faire faire se déplacer les américains et les russes vers leur node objectif de deux façons différentes. Les américains iront rejoindre le node tel que l'on peut le faire pour un seul AI. Pour les Russes nous allons utiliser la variable "self".
Voici le script utilisé
main()
{
maps\_load::main();
//GIVE PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");
//définition des soldats russes//
soldat_russe_1
= getent("russe_1","targetname");
soldat_russe_2 = getent("russe_2","targetname");
//activation des soldats russes.//
soldat_russe_1 thread mouvement_russe();
soldat_russe_2 thread mouvement_russe();
thread mouvement_us();
}
mouvement_us()
{
trigger = getent ("trigg_us","targetname");
trigger waittill ("trigger");
// supprime le trigger une fois actionné
soldat_us_1
= getent ("us_1","targetname");
soldat_us_2 = getent ("us_2","targetname");
node = getnode ("node_us","targetname");
soldat_us_1 setgoalnode (node);
soldat_us_2 setgoalnode (node);
soldat_us_1
waittill ("goal");
soldat_us_1 waittill ("goal");
}
mouvement_russe()
{
trigger_ru = getent ("trigg_russe","targetname");
trigger_ru waittill ("trigger");
node = getnode ("node_russe","targetname");
self setgoalnode (node);
self waittill
("goal");
}
Explications.
main()
{
maps\_load::main();
//GIVE PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");
//définition des soldats russes//
soldat_russe_1
= getent("russe_1","targetname");
soldat_russe_2 = getent("russe_2","targetname");
//activation des soldats russes.//
soldat_russe_1 thread mouvement_russe();
soldat_russe_2 thread mouvement_russe();
//activation des soldats américains//
thread mouvement_us();
}
mouvement_us()
{
trigger = getent ("trigg_us","targetname");//on
récupère le trigger_us
trigger
waittill ("trigger"); //
attend que le trigger soit actionné
soldat_us_1
= getent ("us_1","targetname");//détermine
l’acteur à utiliser
soldat_us_2 = getent ("us_2","targetname");//détermine
l’acteur à utiliser
node = getnode ("node_us","targetname"); //détermine le node à utiliser
soldat_us_1 setgoalnode (node); //connecte
l’acteur
au node
soldat_us_2 setgoalnode (node); //connecte l’acteur
au node
soldat_us_1
waittill ("goal"); //attend
que l’acteur arrive au node
soldat_us_1 waittill ("goal"); //attend
que l’acteur arrive
au node
}
mouvement_russe()
{
trigger_ru = getent ("trigg_russe","targetname");// on
récupère le trigger_russe
trigger_ru waittill ("trigger"); // attend que le trigger soit actionné
node = getnode ("node_russe","targetname");//on détermine le node à utiliser.
self setgoalnode (node);//on connecte les soldats au node.
self waittill
("goal");//on
attend que les soldats terminent leur déplacement.
}
Vous avez sans doute remarqué la différence entre les 2 threads.
Dans le premier, on répète les actions à effectuer pour chacun des soldats et encore ici on a de la chance on ne gère que 2 soldats imaginez un peu avec 15 AI ce que ça peut donner...
Dans le second thread,
une seule ligne est nécessaire pour gérer les déplacements
des 2 soldats. Ceci grace à la varialble "self".
Self remplace ici toutes les entités à conditions qu'elle aient été déterminées
préalablement et qu'elles soient les activateurs du thread.
exemple:
soldat_russe_1
= getent("russe_1","targetname");//on
détermine l'acteur à utiliser
soldat_russe_1 thread mouvement_russe();//Ici on dit au
jeu d'activer le thread
mouvement_russe avec comme variable soldat_russe_1.
comme l'AI a été définie
au moment de l'envoi du thread on peut donc utiliser dans le thread mouvement_russe
la variable "self". Self
remplaçant ici toutes
les variables qui renvoient à cette partie du script. soldat_russe_1 mais aussi soldat_russe_2.
Ceci est très utile car il permet d'allèger considérablement son script. Imaginer
un peu si vous aviez 15 ou 20 entités à gérer en même temps? vous n'avez pas
fini de tapez sur votre clavier.
Bon j'espère avoir été assez clair.
Téléchargez la map test créée pour CODUO.
Tropheus
Pour CaskAmiProd
et MohaaScriptLib
by Tropheus©
juin 2005