Arresto sequenza

« Older   Newer »
 
  Share  
.
  1.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    45
    Reputation
    0

    Status
    Offline
    Esiste un codice per arrestare una sequenza che non sia quella in cui è scritto il codice stasso?
    Grazie in anticipo.
     
    .
  2.     +2   +1   -1
     
    .
    Avatar

    Guerriero

    Group
    Eroi
    Posts
    2,161
    Reputation
    +155
    Location
    Sardegna

    Status
    Anonymous
    Desumendo da quanto hai scritto, credo tu intenda creare una sequenza costituita da un loop infinito e che viene interrotta da un altro comando posto all'interno di un'altra sequenza. Non esiste un comando che ottempera a tale funzione, ma puoi sempre usare le variabili d'ambiente (o variabili globali), che ti danno la facoltà di manipolare una determinata variabile (stringa o numero intero) in ogni sequenza di ogni mappa dell'avventura: è per tale ragione che si tratta di uno strumento molto potente.

    In quanto all'utilizzo, ti basta porre, come condizione del while, la variabile d'ambiente tramite il seguente codice:

    CODICE
    while(EnvReadInt("NOMEVARIABILE")==0){
    //ISTRUZIONI
    ;
    }


    Questo è l'archetipo della sequenza che hai realizzato tu, con la variabile d'ambiente che regola la continuazione/interruzione del loop.
    Per far si che tale sequenza si interrompa tramite l'ordine impartito da un'altra sequenza, posto che essa sia già attiva quando il valore viene cambiato, devi semplicemente scrivere questo:

    CODICE
    EnvWriteInt("NOMEVARIABILE",1);


    Assicurati che il nome della variabile sia IDENTICO, altrimenti il gioco le utilizzerà come due variabili differenti, con il risultato che il ciclo non si interromperà mai.
    Spero di essere stato chiaro e che questa sia la soluzione al tuo problema.
     
    .
  3.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    45
    Reputation
    0

    Status
    Offline
    Grazie mile della risposta. Era esttamente quello che mi serviva però ha funzionato solo in parte. In pratica succede che invece di essere un'azione ripetuta diventa un'azione che succede una volta sola. C'è un modo per fare in modo che non succeda proprio?
    Grazie in anticipo.
     
    .
  4.     +1   -1
     
    .
    Avatar

    Guerriero

    Group
    Eroi
    Posts
    2,161
    Reputation
    +155
    Location
    Sardegna

    Status
    Anonymous
    Non ho ben capito, ciò che intendi. Potresti postare le sequenze coinvolte?
     
    .
  5.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    45
    Reputation
    0

    Status
    Offline
    Questa è quella che si ripete:

    CODICE
    while(EnvReadInt("var1")==0){

    while(!WaitUnitsInArea(Hadrianus1,"a16",100));

    RunConv("conv17");

    StartViewFollow(Hadrianus1);

    BlockUserInput();

    Hadrianus1.SetCommand("move",AreaCenter("a20"));

    while(!WaitUnitsInArea(Hadrianus1,"a20",100));

    UnblockUserInput();

    StopViewFollow();

    ;

    }


    e questa è quella che ho fatto per prova che la arresta:

    CODICE
    while(!WaitUnitsInArea(Hadrianus1,"atest",100));

    SpawnGroup("gruppo9");

    EnvWriteInt("var1",1);


    Il mio problema è che quando la seconda sequenza dovrebbe annulare la prima comunque la fa svolgere una volta. Intendo che invece di ripetersi succede una volta sola ma io vorrei che non succedesse proprio. Grazie in anticipo
     
    .
  6.     +1   -1
     
    .
    Avatar

    Guerriero

    Group
    Eroi
    Posts
    2,161
    Reputation
    +155
    Location
    Sardegna

    Status
    Anonymous
    Ci sono diversi appunti/correzioni/consigli che dovrei sollevare riguardo ai tuoi codici:

    1) Evita di utilizzare troppo spesso e/o a sproposito il ciclo while. Ricorda che si tratta di un ciclo molto utile, ma è anche molto potente e richiede un enorme capacità di calcolo al computer;
    2) Non utilizzare le funzioni latenti (per intenderci quelle che iniziano con Wait), tranne quella per le conversazioni (WaitConvRequest), perché risultano pesantemente buggate (a difficoltà difficile la sequenza non funzionerà);
    3) Utilizza SEMPRE uno Sleep in una sequenza con while, anche con un valore basso (ad esempio 10), perché evita al gioco di eseguire l'intero blocco di istruzioni ben 1000 volte al secondo;
    4) Utilizza nomi di variabili comprensibili e distinguibili, perché eviti un sacco di grattacapi (pensa a 100 diverse aree che si chiamano "area1", "area2", "area3" e così via: quanto è difficile identificarle immediatamente in una mappa?);

    Le sequenze andranno riscritte in questo modo:

    CODICE
    while(EnvReadInt("var1")==0){
           if((AreaObjs("a16","Military").Contains(Hadrianus1) && EnvReadInt("var1")==0)){
                   RunConv("conv17");
                   StartViewFollow(Hadrianus1);
                   BlockUserInput();
                   Hadrianus1.SetCommand("move",AreaCenter("a20"));
                   Sleep(5000);
                   UnblockUserInput();
                   StopViewFollow();
           }
           Sleep(100);
    }


    CODICE
    while(!AreaObjs("atest","Military").Contains(Hadrianus1)){
           Sleep(100);
    }
    SpawnGroup("gruppo9");
    EnvWriteInt("var1",1);
     
    .
  7.     +1   -1
     
    .
    Avatar

    Contadino

    Group
    Member
    Posts
    45
    Reputation
    0

    Status
    Offline
    Grazie mille dei consigli, in questo modo ha funzionato.
     
    .
6 replies since 16/6/2018, 16:06   100 views
  Share  
.