(Je met ça dans un nouveau thread afin de pouvoir le linker dans le sommaire et afin de fair partager plus facilement la fonction, qui est planquée en réponse dans un autre topic)
Script de génération aléatoire de location dans une zone définie (un trigger rectangle).
Tout d'abord, voici le premier script, "io_gen_rdmloc", qui permet d'avoir accès à une fonction nommée GenerateRandomLocation().
// io_gen_rdmloc //
// fichier include //
//::///////////////////////////////////////////////
//:: GenerateRandomLocation
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Cette fonction cree une location aleatoire dans une zone rectangle.
Elle admet un degre de precision (entre 1 et 0.000001, et inferieur),
et admet un bon nombre de parametres.
*/
//:://////////////////////////////////////////////
//:: Created By: Ange Musicien
//:: Created On: Forum Maskado - JOL
//:://////////////////////////////////////////////
// Générer aléatoirement une location dans une zone rectangle, qui peut etre une aire.
// - oArea: Aire dans laquelle est situee la zone rectangle.
// - Xmin : minimum en abscisse pour la zone
// - Ymin : minimum en ordonnee pour la zone
// - Xmax : maximum en abscisse pour la zone
// - Ymax : maximum en ordonnee pour la zone
// - fPrecision : la precision de la location. Elle est a 0.01f par defaut, mais peut
// aller de 1 a 0.000001 ou inferieur. C'est le nombre de decimales admises pour
// les abscisses et ordonees de la location aleatoire.
// - fZ : hauteur de la location, par defaut 1.0
location GenerateRandomLocation(object oArea, float Xmin, float Ymin, float Xmax, float Ymax, float fPrecision = 0.01, float fZ = 1.0);
location GenerateRandomLocation(object oArea, float Xmin, float Ymin, float Xmax, float Ymax, float fPrecision, float fZ)
{
float Xdif, Ydif, fX, fY, YdifPre, XdifPre, YdifPre2, XdifPre2, Xmul, Ymul;
int nX, nY, nXP, nYP ;
vector v;
location l;
Xdif = Xmax-Xmin;
Ydif = Ymax-Ymin;
XdifPre = Xdif/fPrecision;
YdifPre = Ydif/fPrecision;
XdifPre2 = XdifPre + 1.0;
YdifPre2 = YdifPre + 1.0;
nX = Random(FloatToInt(XdifPre2));
nY = Random(FloatToInt(YdifPre2));
Xmul = IntToFloat(nX);
Ymul = IntToFloat(nY);
fX = Xmul*fPrecision;
fY = Ymul*fPrecision;
fX = fX + Xmin;
fY = fY + Ymin;
v = Vector(fX,fY,fZ);
l = Location(oArea,v,0.0);
return l;
}
Voici un exemple d'application, ce script crée une boule de feu aléatoirement toutes les six secondes, dans un rectangle de 10x10 (placé au milieu d'une zone de 30x30). Il est placé dans le OnHeartBeat d'une zone :
// OnHeartBeat //
#include "io_gen_rdmloc"
void main()
{
object oArea;
location l;
effect e;
oArea = OBJECT_SELF;
l = GenerateRandomLocation(oArea,10.0,10.0,20.0,20.0);
e = EffectVisualEffect(VFX_FNF_FIREBALL);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,e,l);
}