Boucle while infinie

Répondre
Partager Rechercher
Bonjour a tous.
J'ai un problème de script.
J'ai voulu appliquer une boucle while pour accomplir une action après qu'un boss ai perdu un certains nombres de PV.
La voici

int nPV=GetCurrentHitPoints(oboss);
while(nPV>=650)
{
nPV=GetCurrentHitPoints(oboss);
}

or pour une raison inconnue cela ne marche pas. oboss est bien reconnu ( je l'ai vérifié en lui ajoutant un objet dans son inventaire ) mais la boucle semble ne pas se terminer.

Cela pourrait-il être du au fait que la boucle accompli un certain nombre de cycle avant que la vie de oboss descende en dessous de 650 PV?

Merci d'avance pour votre aide.
Bonjour,

oui effectivement, le while n'est pas approprié pour faire ce que tu désires.

il est possible de la faire dans le OnDamaged du boss avec un SI

int nPV=GetCurrentHitPoints(oboss);

IF (nPV > 1 AND nPV < 650) then {

faire action précise

}


il est plus simple de voir la logique inverse comme ceci que de boucler tant qu'il est hors des limites.

oui j'avais pensé à ça mais je me disais que nPV devais être mis a jour puisque la vie de oboss varie. Ce que tu veux dire c'est que nPV sera toujours égale à la vie de oboss et se mettra à jour toute seule?
Si tu utilises l'évènement "OnDamaged", ton script se déclenchera à chaque fois que ton boss subira des dégâts.
Par conséquent nPV sera toujours la vie actuelle du boss
Je suis d'accord avec ça mais à chaque fois que le monstre subira des dégâts après avoir vérifié une fois la condition, celui ci reproduira la même action jusqu'à sa mort à chaque dégâts qui lui est infligé.
En fait je n'arrive pas à saisir pourquoi ma boucle while de départ ne fonctionne pas. Les boucles while ont-elles un nombre limité de tour?

J'ai aussi essayé avec une boucle for mais le résultat est le même.

Peut on faire une boucle while avec des if et des else? Si c'est le cas je pourrais contourner cette limite de tour.
je le répète la while n'est pas la solution

si tu ne désires pas qu'il entreprenne plusieurs fois l'action, il te suffit simple de mettre un flag exemple :

int nPV=GetCurrentHitPoints(oboss);
int nActionFaite = GetLocalInt(oboss, s_FlagAction); // 0 par défaut par encore faire l'action ou 1 si l'action a été ralisée

IF (nPV > 1 AND nPV < 650) then {

IF (nActionFaite = 0) then {
nActionFaite = 1;
faire action précise
}

}


cela aura pour conséquence qu'il ne fera qu'une fois l'action
biensur il faut avoir attribué au boss une variable de type int ou tu lui attribue la valeur 0.

d'autres questions ?
Citation :
Publié par vicocchips
En fait je n'arrive pas à saisir pourquoi ma boucle while de départ ne fonctionne pas.
C'est très simple, tu fais quelque chose qui n'a pas de valeur logique. While est utilisé pour d'autres types de boucles, type GetNextObject :

Code PHP:

while( GetIsValidObjetoObject ) ) {

    
// Mes actions

    
oObject GetNextObject();


Avec des noms de fonction bidon, je n'ai pas d'éditeur sous la main, c'est pour l'exemple.

Si tu veux, effectivement, exécuter du code lorsque ton Boss est passé sous 100 PdV par exemple, il faudra que tu fasses :

# Un nouveau script nommé par exemple ev_od_boss01

# Tu places dans les évènements de créature ce script dans la ligne OnDamaged

# Tu crées ton script sous la forme décrite par Nosfe en ajoutant les actions éventuelles à l'emplacement voulu :
Code PHP:

object oBoss OBJECT_SELF;

// On récupére les variables 
int nPV=GetCurrentHitPointsoBoss );
int nActionFaite GetLocalInt(oBosss_FlagAction); 

// Suffisament perdu de PdV ?
If (nPV 100) {

   
// Script n'a pas encore été exécuté  ?
   
If ( nActionFaite != 1) {

     
nActionFaite 1;

     
// Mes actions : spawner une créature, ou quoi que ce soit
    // ...
   
}

# Après quoi tu compiles, bien sûr
Pour ce qui est de la boucle en elle même, le problème c'est que ta variable nPV ne change pas de valeur (si le script est exécuté dans le OnDamaged).

Code PHP:

 int nPV=GetCurrentHitPoints(oboss);
 while(
nPV>=650)
    {
       
nPV=GetCurrentHitPoints(oboss);
    } 
Quand l'évènement OnDamaged est déclenché, ton script l'est également. Mettons que ta créature a 800 PV à ce moment là.
Donc nPV vaut 800 et tu rentres dans la boucle. Seulement ton boss aura toujours 800 PV jusqu'à ce que l'évènement OnDamaged soit à nouveau appelé.
Et si ta créature a encore plus de 650 PV, on déclenche une deuxième boucle (alors que la première n'est toujours pas finie). Tu vois bien qu'il y a un problème de conception là-dedans.
Comme l'ont dit Laban et nosfe_, le meilleur moyen pour faire ce que tu veux est de définir une variable qui permettra de savoir si l'event a déjà été déclenché ou non.
Ok c'est bon j'ai utilisé le OnDamaged. J'ai appliqué une variable et ça marche.
Pour répondre à Mithra je n'avais pas appliqué mon script dans OnDamaged mais dès la rencontre avec la créature.
Et j'ai vérifié, la boucle s'arrête avant que le boss m'ai atteint. Je pense que la boucle doit se terminer toute seule si la valeur de la variable est inchangée sur 500 tours à peut près.

Merci beaucoup à tous j'étais parti dans des tests loufoques comme essayé de mettre en pause la boucle 1 seconde à chaque tour avec un delaycommand. Je suis débutant et ce n'est que mon deuxième script. (le premier prenant 2 lignes )
Citation :
Publié par nosfe_
biensur il faut avoir attribué au boss une variable de type int ou tu lui attribue la valeur 0.
Ce n'est pas la peine puisque par défaut la valeur est 0 quand on fait un GetLocal sur une variable qui n'a pas été assignée.

Je dis ca à titre d'information simplement car c'est pratique (et c'est pour ca qu'on utilise ici la valeur 0 et pas autre chose pour dire que l'action n'a pas encore été faite).
oui c'est vrai que c'est pratique. C'est ce que j'ai fait. Mon boss ayant 3 phases cette valeur passe à 1 après la première et à 2 après la deuxième. Ensuite il meurt et quand il réapparait sa valeur est revenue à zéro puisque c'est celle du blueprint.
Répondre

Connectés sur ce fil

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