[fonction] spawn aléatoire dans une courone => pas bo ;(

Répondre
Partager Rechercher
alors, encore un truc que g fais, et surlequel j'aimerai des commentaires
en fait, c'est une fonction qui permetrait de spawner des sterums à une location aléatoire, dans une couronne, pour pouvoir en fait les spawner autour d'un streum (oui g déjà posé la question avant ) le probleme c'est que tt a fait aléatoire, ca rend pas bien du tt, donc je suis pobligé de forcer un peu les choses, pour pas avoir tout le monde du même coté, en paquets, etc.
voila ou j'en suis :

Code PHP:

void Spawn(string sResrefint nNblocation lLoc)
{
   
int i nNb;
   
object oCreated;
   
location lAlea lLoc;
   
object oArea;
   
vector vCentre;
   
vector vVec;
   
float fCentrey;
   
float fCentrex;
   
float fx;
   
float fy;
   
float fNorme;
   
int nAngMin 360/nNb;
   
int nPoM;
   
float fAngle IntToFloat(Random(361));
   
float fAngDeb fAngle;
   while(
0)
          {
          
vCentre GetPositionFromLocation(lAlea);
          
oArea GetAreaFromLocation(lAlea);
          
fCentrex vCentre.x;
          
fCentrey vCentre.y;
          
fNorme IntToFloat(Random(31)+20)/10;  //norme : entre 2 et 5 metre (au dixieme pres)
          
fx fNorme*cos(fAngle);
          
fy fNorme*sin(fAngle);
          
fCentrex += fx;
          
fCentrey += fy;
          if(
fCentrey 0.0fCentrey 0.0;    //on reste sur la carte
          
if(fCentrex 0.0fCentrex 0.0;    //on reste sur la carte
          
vVec Vector(fCentrexfCentrey0.0);//on reforme le vecteur
          
lLoc Location(oAreavVec0.0); //y a cb d'orientation possible ?
          //on refait un angle aleatoire, pour le prochain
          
fAngle fAngDeb;   //angle
          
nPoM Random(35)+10;  //de combien varie l'angle
          
if(Random(2)==0nAngMin -= nPoM; else  nAngMin += nPoM// l'angle varie en plus ou en moins
          
fAngle += IntToFloat(nAngMin); //on fait varier l'angle
          //on prepare un autre angle de facon sure, qu'on feras varier
          
nAngMin 360/nNb;
          
fAngDeb += IntToFloat(nAngMin);//on fait tourner l'angle (pourla fois suivante)

          
CreateObject(OBJECT_TYPE_CREATUREsResreflLocFALSE);
          
i--;
          }  
return;

alors je sais, c'est encore un gros machin indigeste, mais je poste un module demo ce soir si vraiment c trop indigeste

alors, pour l'instant je suis pas trop satisfait, mais je vois pas trop quoi faire, j'ai éssayé plein de réglages, mais bon ... alors si vous aviez des idées pour améliorer
petit module demo

on ramasses le bouquin, on lance le pouvoir unique loin de sois, et 10 gus entourant un 11 apparaissent, et nous regardent droit dans les yeux *glups*

en gros pour l'instant ca spawn le nb de créatures qu'on veut, à une distance comprise entre 2 et 5 mètres (je crois) du centre, avec un angle séparant chaque créatures de 360/nb de créatures , chaque créatures s'écartant de plus ou moins 45° de ces angles.

enfin de mémoire

alors si vous aviez des idée de paramètres pour rendre les choses plus armonieuses mais aleatoires . . .
Euh je comprend pas ce que tu veux, tu veux qu'ils forment un beau cercle ou que se soit aléatoire ????

Si c'est un beau cercle, la solution de divisé les 360° en parts égale et la meilleure je pense.

Pour que le cercle soit plus beau, il faut virer les 45° aléatoires.

[Edit : je viens de me dire que c'est peut-etre le code en lui meme que tu veux "plus beau"

Voici ma version, qui en theorie devrai faire exactement la meme chose (peu pas tester suis au boulot) mais un tantinet plus clair (ce n'est evidemment que mon avis)

Code PHP:

void Spawn(string sResrefint nNblocation lLoc)
{
    
int nAngMin 360/nNb;

    
//le centre ne change pas, on l'initialise en dehors de la boucle
    
vector vCentre GetPositionFromLocation(lLoc);
    
object oArea GetAreaFromLocation(lLoc);
    
float fCentrex vCentre.x;
    
float fCentrey vCentre.y;

    
//determination de l'angle de depart
    
float fAngleDeb IntToFloat(Random(361));
    
float fAngle fAngDeb;

    
//variable utilisée pour la generation aleatoire
    
float fx,fy,fNorme;
    
int nAngVar;

    while(
nNb 0){

        
//determination de la part aleatoire du vecteur
        
fNorme IntToFloat(Random(31)+20)/10;  //norme : entre 2 et 5 metre (au dixieme pres)
        
fx fNorme*cos(fAngle);
        
fy fNorme*sin(fAngle);

        
fx += fcentrex; if(fx 0.0fx 0.0;    //on reste sur la carte
        
fy += fcentrey; if(fy 0.0fy 0.0;    //on reste sur la carte

        //on recompose une "location" et on y cree le monstre
        
CreateObject(OBJECT_TYPE_CREATUREsResrefLocation(oAreaVector(fxfy0.0), 0.0), FALSE);

        
//on determine une variation de l'angle (+-45°)
        
if(Random(2)==0nAngVar -= (Random(35)+10); else  nAngVar += (Random(35)+10);

        
//on calcul le nouvel angle
        
fAngle IntToFloat(nAngMin+nAngVar);

        
nNb--;
    }  

Apres c'est peut-etre la repartition dans le disque qui te gene (et non pas dans la courrone puisque la norme est aleatoire !
Pour harmoniser ca, essai peut-etre de mettre 2 monstres par angle ...
bon, alors en fait, je voulais un spawn aléatoire dans un cercle de 10m de diamètre, mais completement aleatoire, on se retrouvais avec des ensembles assez moches, des paquets dans un coin, d'un coté très loin et de l'autre très près etc.
donc je me suis dit, parfait, on va chercher un compromis entre parfaitement ordonné et complètement aléatoire
donc j'ai déterminé des "rayons" (comme une roue) en divisant l'angle total par le nombre de spawn, mais comme je veu pas une roue autour, ba j'introduis une variation à Random(45), seulment, on se retrouve svt avec des trucs moche du style
90-30=60
60+90-25=125
125+90-15=200
200+90+10=300
et on a un paquet de monstre avec un grand arc vide, et c'est moche
donc je fais
90-30=60
180-25=155
270-15=255
360+10=370

et c'est un peu moins aleatoire, mais qd même, et on se retrouve pas avec des gros paté dans une tranche, a chaque fois ma variation s'applique au rayon calculé au début

(euh, chuis clair ?)

donc tt est un peu comme ca, pour la norme, euh, elle est comprise entre 2 et 5 mètres, donc c'est une couronne non ?
enfin d'après mes test à peu près ^_^
fin bon, en tt cas merci pour ton script, ca va m'aider à mieux "m'exprimer"

en fait ce que je voulais, c'est savoir si vous aviez d'autres idée pour armoniser le truc
le pb en mettant plusieurs monstres par tranches, c'est que si il y a pas bcp de monstres, ca rend pas top
et comme c'est prevu pour être appliqué à 7 monstres maximum

enfin ca rend pas mal, mais le truc c'est que c'est plus ou moins prévu pour mettre autour d'un monstre, donc bon, je n'étais pas entierement satisfait . . .

autre cose, a votre avis, faut ils les orienter tous dans le même sens ? aléatoirement ? vers l'exterieur du cercle peut être . . .

fin, pour préciser une dernière fois ma demande, j'aimerai vos avis sur l'effet rendu (merci pour les avis déjà partagés )et eventuellement sur la syntaxe du script, sa lourdeur par exemple etc. (remerci )
Ouah, max 7 monstres ca va pas être évident, on ne peu pas jouer avec les probabilités ....
Je ne vois vraiment pas comment .... a moins de prévoir 5-6 groupes de positions et de déterminer aléatoirement quelle sera la formation utilisé ...

(ah oui, vu comme ca c'est une couronne, désolé )
mm, p-e voir ca le coup des "formations", mais bon, faudrais en prevoir pas mal, et comme le nombre de monstre varie entre 1 et 7 faut en prévoir pas mal . . .
peut être plutot chercher à enregistrer les differentes locations crée au fur et a mesure pour poser des conditions . . . quelqu'un à des idées de conditions ?
Oui :
-chaque position (sauf la premières) doit être a la distance minimal de X des autres
-chaque position (sauf les 2 premières) doit être a la distance maximal de Y de 2 autres positions

Courrage ! Le résultat sera beau je pense
euh, dsl, mais je comprend pas trop ce que tu veux dire
dsl hein, j'ai un peu de mal en geometrie :bouffon:
par "distance minimal de X des autres", tu veu dire le plus proche possible dans les abscisse, ou bien au moins à X m
et pour l'autre
Y c'est le maximal de la distance entre la loc et deux autres ou bien c'est d'ordonné que tu parle
Pour que les monstres spawn dans un semblant de cohérence, il faut que chacun d'eux se trouve a une distance des autres comprise dans une fourchette X>Distance>Y

Mais appliquer cette condition a un seul autre ne suffi pas, tes 7 monstres pouvant alors spawner en rang (dans un rang chacun est proche de l'autre) alors qu'on veux une mêlé.

C'est pour ca qu'a mon avis il faut que chacun soit placer en fonction de 2 autres.

Mais a mon avis tu t'embêtes énormément pour pas grand chose lol.

Tien au passage ca peu toujours servir et c'est en plein dans le sujet, voici une fonction qui fait parti de mon système de spawn et qui permet de générer un point aléatoire dans un disque délimité par un centre et un rayon :
Code PHP:

location PointAleatoire(float fRayonobject oAreafloat xfloat yfloat z//On recupere les coordonnees x,y et z + area du point central
{
    
//On determine aleatoirement une distance et un angle
    
float nDistance fRayon*d100()/100;
    
int nAlpha 360*d100(1)/100;

    
//a partir de la on construit une nouvelle location
    
location lLieu Location(oArea,Vector(x+nDistance*cos(IntToFloat(nAlpha)),y+nDistance*sin(IntToFloat(nAlpha)),z),IntToFloat((360*d100(1))/100));
    return 
lLieu;

well well well, merci beaucoup *prend des notes*

hum, dis moi, il y a t'il une raison particulière au

fRayon*d100()/100;

plutot que, ba par exemple ce que je fais

c'est plus léger, c'est plus joli, c'est plus rigoureux, c'est plus mieux-na, etc.

pis pour les spawns, je pense qu'en fait je vais plus ou moins laisser en l'état, enfin, je vais clarifier celon ce que tu m'as montré, peut être essayer les conditions, mais ca m'a l'air vraiment compliqué, à moins de relancer les random jusqu'a satisfaire les conditions . . . enfin je verrais

en tt cas merci, si vous avez une illuminations, une remarque quelconque, surtout n'hésitez pas, c'est ce que je recherche
Citation :
Provient du message de Reyan

hum, dis moi, il y a t'il une raison particulière au
fRayon*d100()/100;
plutot que, ba par exemple ce que je fais
c'est plus léger, c'est plus joli, c'est plus rigoureux, c'est plus mieux-na, etc.
Ca va surtout plus vite a taper que random, pis je trouve ca plus joli.
En plus lorsqu'une fonction existe, autant l'utiliser ...
Enfin Random(100) je ne sais jamais si ca donne un chiffre entre 1 et 100 ou 0 et 100 ou 0 et 99, alors qu'un dé à 100 faces c'est un dé à 100 faces.
oki doki, et pour info, il me semble que Random(100) donneras un chiffre entre à et 99 inclus enfin, j'en suis sure
mais c'est tjrs interessant de voir d'autre facon d'écrire le même truc ^_^
sinon un dernier truc,
faire
float f1, f2, f3;

est très différent de
float f1;
float f2;
float f3;
?
niv "y a un cycle cpu de moins", ou bien c'est juste plus joli (parce que c'est vrai que ca allège mine de rien, vais enfin pouvoir m'y retrouver dans toutes mes variables )
Non, théoriquement y a aucune différence (maintenant, vu que le compilateur d'Aurora se débrouille comme un pied, on sait jamais... )

Par contre, là où il devrait y avoir une différence (et où y en as pas parce que le compilateur est une pauv' m**** (enfin il a le mérite d'être là ) ), c'est entre :
Code PHP:

float f1 0.1ff2 1.36f
et
Code PHP:

float f1f2;
f1 0.1f;
f2 1.36f
Normalement il devrait être plus rapide d'initialiser et affecter une variable en une seule fois, mais... Enfin c'est toujours une bonne habitude à prendre !
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés