Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problemi su while e variabili
Forum - C# / VB.NET - Problemi su while e variabili

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2045
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:21
Domenica, 21/03/2021
Buongiorno ragazzi, anche se dal titolo può sembrare una cosa abbastanza banale da risolvere,
ci sto da mesi sopra senza aver trovato ancora una soluzione.

Da solo su 40.000 righe di codice, e probabile confondersi. Magari con l'aiuto di più cervelli riesco a trovare una soluzione.
Vi spiego il problema.

Ho interprete di codice, l'ho chiamato ComCode che sarebbe un semplice interprete lineare.

{comando} [spazio] {variable} [operazione] {spazio} [valore]

il problema non è nell'interprete, ma come gestire uno script.
Per maggiori dettagli questi sono i Token utilizzabili

Codice sorgente - presumibilmente VB.NET

  1. internal enum TokenType
  2.     {
  3.         Identifier,
  4.         Integer,
  5.         Float,
  6.         Boolean,
  7.         String,
  8.         Equals,
  9.         NotEquals,
  10.         Greater,
  11.         Less,
  12.         INCLUDE,
  13.         SETGLOBAL,
  14.         SET,
  15.         ADD,
  16.         SUBTRACT,
  17.         MULTIPLY,
  18.         DIVIDE,
  19.         TO,
  20.         FROM,
  21.         BY,
  22.         IF,
  23.         THEN,
  24.         ELSE,
  25.         ENDIF,
  26.         WHILE,
  27.         ENDWHILE,
  28.         CALL,
  29.         BLOCK,
  30.         ENDBLOCK,
  31.         YIELD
  32.     }



il problema riguarda lo sviluppo di uno script.
Gli script non possono essere gestiti uno alla volta ma devono essere gestiti tutti assieme,
questo perché nel mio motore Mire Engine al metodo update, vanno ciclati tutti gli NPC che contengono questi script.
Il tutto funziona regolarmente, ma ho problemi quando provo a mostrare un dialogo.


il codice del dialogo è questo in C# per gestire alcuni comandi

Codice sorgente - presumibilmente C#

  1. void update()
  2. {
  3.  
  4.   //........
  5.  
  6. else if (strCommand == "SayNPC")  //Se in un script è presente la riga SayNPC
  7.                   {
  8.                       if (!Other_NPCTALK)  //Se qualche altro NPC sta parlando
  9.                       {
  10.                           Talking_Message = (String)listParameters[0]; //testo del messaggio ricavato dai parametri
  11.                           talking = true;  //sta parlando
  12.  
  13.                           Talk((string)listParameters[0]);  //Mostra la grafica con la stringa
  14.                       }
  15.  
  16.                      
  17.                   }
  18.                   else if (strCommand == "WaitKey") //attendi un tasto
  19.                   {
  20.                       if (Input.Keyboard.GetState().IsKeyDown(Input.Keys.Enter))
  21.                       {
  22.                           talking = false; //sta parlando
  23.                           scriptContext.GlobalVariables["dialog"] = false; //imposta la variabile nello script dialog su false
  24.                           Other_NPCTALK = false; //altri npc parlano false
  25.                           Thread.Sleep(100); //pausa
  26.                       }
  27.                   }
  28.  
  29. }




Gli NPC hanno uno script loro, quindi presumiamo che per ogni scena ci siano almeno 10 / 11 npc devono funzionare
tutti contemporaneamente e ed essere interpretati tutti assieme allo stesso momento. in più hanno posso accedere tutti a delle variabili che nello script vengono dichiarate come SETGLOBAL

dunque vi spiego nel dettaglio cosa succede.

1)
Dall'editor creo un evento facendo doppio click in un area

https://i.ibb.co/qWZqS6z/Cattura.png




2) Creo un semplice dialogo tipo ciao pierotofy

https://i.ibb.co/JQ2FY64/Cattura.png


3) Salvando la mappa di gioco attuale, entra il comcode in azione generando uno script

Codice sorgente - presumibilmente Delphi

  1. //ComCode Basic
  2.             ComCode2.Add("SETGLOBAL Down  TO \"Down\"");
  3.             ComCode2.Add("SETGLOBAL Left  TO \"Left\"");
  4.             ComCode2.Add("SETGLOBAL Right TO \"Right\"");
  5.             ComCode2.Add("SETGLOBAL Up    TO \"Up\"");
  6.             ComCode2.Add("SETGLOBAL dialog TO FALSE");     //variable del Dialogo
  7.            
  8.  
  9.             ComCode2.Add("SETGLOBAL MoveDown TO \"MoveDown\"");
  10.             ComCode2.Add("SETGLOBAL MoveUp TO \"MoveUp\"");
  11.             ComCode2.Add("SETGLOBAL MoveRight TO \"MoveRight\"");
  12.             ComCode2.Add("SETGLOBAL MoveLeft TO \"MoveLeft\"");
  13.  
  14.  
  15.             ComCode2.Add(string.Format("SetNPCPosition {0} {1}", evx, evy));
  16.             ComCode2.Add("WaitKey");
  17.  
  18.             List<string> temp = ReturnComCode();
  19.  
  20.             for (int i = 0; i < temp.Count; i++)
  21.             {
  22.                 if (temp[i].Contains("\n"))
  23.                     temp[i] = temp[i].Replace("\n", "");
  24.  
  25.                 if (temp[i].Contains("-"))
  26.                 {
  27.                     string[] t = temp[i].Split('-');
  28.                     foreach (string s in t)
  29.                     {
  30.                         ComCode2.Add(s);
  31.                     }
  32.                 }
  33.  
  34.                 if (temp[i].ToLower().Contains("saynpc"))
  35.                 {
  36.                     ComCode2.Add("SET dialog TO TRUE");
  37.                     ComCode2.Add(temp[i]);
  38.                     ComCode2.Add("WHILE dialog = TRUE");
  39.                     ComCode2.Add("WaitKey");
  40.                     ComCode2.Add("YIELD");
  41.                     ComCode2.Add("ENDWHILE");
  42.  
  43.                 }



I Comandi SayNPC e Waitkey li trovate sopra,
in seguito salvo e faccio partire,

Normalmente, il while è settato su FALSE nelle dichiarazioni delle variabili in alto.
Ma se notate, prima della funzione SayNPC c'è il Waitkey che dovrebbe attendere prima la pressione di un tasto,
e poi in seguito continuare andando in while.
Premendo enter esempio, la funzione in C# attiva la variabile dell'npc su True azionando il while.

al fine di ottenere lo script in un qualcosa del genere

Codice sorgente - presumibilmente VB.NET

  1. SETGLOBAL Down  TO "Down"
  2. SETGLOBAL Left  TO "Left"
  3. SETGLOBAL Right TO "Right"
  4. SETGLOBAL Up    TO "Up"
  5. SETGLOBAL dialog TO FALSE  //variabile del dialogo
  6.  
  7. SetNPCPosition 224 224
  8.  
  9. SET dialog TO TRUE
  10. SayNPC "ciao pierotofy"
  11.  
  12. WHILE dialog = TRUE
  13. WaitKey
  14. YIELD
  15. ENDWHILE



ma cosa succede?

Appena avvio il client di gioco ecco cusa accade

https://i.ibb.co/QkKFTxH/Cattura.png
il messaggio appare all'istante ignorando completamente ciò che avevo scritto nel while.
e non sò come risolvere questo problema perché lo script Apparentemente "sembra corretto"
o forse sbaglio qualcosa non saprei.

ma posso assicurare che l'interprete funziona alla perfezione, non ha nessun errore e con altre istruzioni
che non sia il dialogo funziona a meraviglia.

Magari è proprio il metodo del dialogo impostato sbagliato, avete idee o consigli? :d


Ecco il video per vedere cosa succede
https://www.mediafire.com/file/g1kupxwzop6udub/bandicam_202 ...

Ultima modifica effettuata da Thejuster il 21/03/2021 alle 10:32


PM Quote