Probleme dans une boucle.

Répondre
Partager Rechercher
Hello.

J'ai fait un petit script de spawn de monstre avec une boucle :

Code PHP:

void main()
{
 
object oPC GetEnteringObject(); 
 
object oArea0505 GetObjectByTag("0505");

 
string sArea0505 GetTag(oArea0505);
 
string sCreature "npc_"+sArea0505+"_1"

 
int nBoucle 0;
 
int nNumero 0;
 
string sNumero IntToString (nNumero+1); 
 
 
// SPW_npc_0505_1_1 à SPW_npc_0505_1_5
 
location lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+sNumero));

 if(
GetIsPC(oPC))
 {
  while(
nBoucle>=0)
  {
   if(
nBoucle==5)
   {
    
SpeakString("test fin de boucle",TALKVOLUME_SHOUT);
    break;
   }
   else
   {
   
SpeakString("test de la boucle",TALKVOLUME_SHOUT);
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
   
nBoucle++;
   
nNumero++;
   }
  } 
 }  

La boucle se réalise bien, j'ai bien les 5 messages voulu et le dernier comme quoi la boucle est out. Le probleme c'est que ca me cré les 5 mobs sur le meme Waypoint et non pas un mobs par Waypoint.

Je pensais qu'en mettant "nNumero++;" ca faisait passer au Waypoint suivant et que ca irait. Mais c'est pas le cas et je vois pas du tout où se trouve mon erreur.

Si qu'lqu'un peut m'aider merci (je précise que j'ai suivi le cours de script du site sur les while/for et que j'ai opté pour créer une boucle infini que je shoot avec un "break;" - j'arrive mieu a me servir des boucles comme ça pour commencer). La gestion des tag/resref je commence à maitriser, pas encore les IntToString et similaire, c'est un peu confus.
Peut-être que ça ...
Code PHP:

lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+sNumero)); 

... devrait apparaître après ton incrémentation de nNumero, ainsi que le transtypage au passage.

... et les break, beurk ... à bannir de tout code propre .

[Edit : Qu'elle est vilaine ta boucle . Quand tu connais les bornes, préfère un for, c'est plus pratique.]
Pendant que ton script effectue la boucle il me semble qu'il ne touchera pas à

string sNumero = IntToString (nNumero+1);

ni à

location lCreature = GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+sNumero));

donc le WP de destination ne changera pas.

Met ces lignes de déclaration en début de boucle pour qu'il les modifie à chaque tour

edit: met aussi ton while sur <5 ça t'évitera le if avec le break

reedit (j'aime bien ça xD)

Citation :
void main()
{
object oPC = GetEnteringObject();
object oArea0505 = GetObjectByTag("0505");
string sArea0505 = GetTag(oArea0505);
string sCreature = "npc_"+sArea0505+"_1";
int nBoucle = 0;
int nNumero = 0;

// SPW_npc_0505_1_1 à SPW_npc_0505_1_5
if(GetIsPC(oPC))
{
while(nBoucle<5)
{
string sNumero = IntToString (nNumero+1);
location lCreature = GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+sNumero));
SpeakString("test de la boucle",TALKVOLUME_SHOUT);
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
nBoucle++;
nNumero++;
}
SpeakString("test fin de boucle",TALKVOLUME_SHOUT);

}
}
Merci, j'avais aussi trouver la soluce en pensant juste qu'une boucle c'est qu'un rond et que tout ce qui se trouve en dehors est pas touché

Code PHP:

void main()
{
 
object oPC GetEnteringObject(); 
 
object oArea0505 GetObjectByTag("0505");

 
string sArea0505 GetTag(oArea0505);
 
string sCreature "npc_"+sArea0505+"_1"

 
int nBoucle 0;
 
int nNumero 0;

 if(
GetIsPC(oPC))
 {
  while(
nBoucle>=0)
  {
   if(
nBoucle==5)
   {
    
SpeakString("test fin de boucle",TALKVOLUME_SHOUT);
    break;
   }
   else
   {
   
nNumero++;
   
// ici j'ai enlever le +1 car le premier Waypoint était pas utilisé
   
string sNumero IntToString (nNumero);
    
// SPW_npc_0505_1_1 à SPW_npc_0505_1_5
   
location lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+sNumero));
   
SpeakString("test de la boucle",TALKVOLUME_SHOUT);
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
   
nBoucle++;
   }
  } 
 }  

Merci
Tu n'a pas besoin de ton test de nBoucle == 5, tu devrais le faire direct avec ton while. Exemple :

Code PHP:

//crée 5 mob sur les wp _0 à _4
int numero 0;
while(
numero 5)
{
     
// SPW_npc_0505_1_1 à SPW_npc_0505_1_5
     
location lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString (numero)));
     
SpeakString("test de la boucle",TALKVOLUME_SHOUT);
     
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE); 
     
numero++;

Si tu veux tu peux remplacer le while par un for comme dit plus haut

Code PHP:

int numero 0;
for(
numeronumero 5numero++)
{
     
//le code ici

Evitez si possible les créations de variable dans la boucle, assignation ça va mais création ça pourrait donner des trucs bizarres. En épurant un peu l'affaire :
Code:
void main()
{
 object oPC = GetEnteringObject(); 
 object oArea0505 = GetObjectByTag("0505");

 string sArea0505 = GetTag(oArea0505);
 string sCreature = "npc_"+sArea0505+"_1"; 
 
 // SPW_npc_0505_1_1 à SPW_npc_0505_1_5
 location lCreature;
 int i=0;
 while(i<5)
 {
   lCreature = GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(i+1)));
   CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
   i++; 
 }
}
Au début de ton script tu fais une chose étrange, tu demandes un objet de tag "0505" puis une fois récupéré tu demandes son tag... si tu souhaites récupérer le tag de la zone actuelle utilise plutôt GetArea(UnObjetseTrouvantDansLaZone) si tu utilises GetArea(oPC) ça rendra bien sûr le fonctionnement du script différent selon la zone(ce qui est peut-être bien le but recherché).
Code PHP:

 while(i<5)
 {
   
lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(i+1)));
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
   
i++; 
 } 
ca ca peut s'ecrire comme cela et cela sera un petit plus rapide car une operation de moins pour le meme resultat ;-)
Code PHP:

 while(i<5)
 {
   
i++;
   
lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(i)));
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
 } 
ou encore comme cela
Code PHP:

 while(i<5)
 {
   
lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(++i)));
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
 } 
ou
Code PHP:

i=1
 
while(i<=5)
 {
   
lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(i++)));
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);
 } 
ou
Code PHP:

for (i=1<= 5i++)
{
   
lCreature GetLocation(GetWaypointByTag("SPW_"+sCreature+"_"+IntToString(i)));
   
CreateObject(OBJECT_TYPE_CREATURE,sCreature,lCreature,FALSE);


etc...
Répondre

Connectés sur ce fil

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