Thejuster (Admin)
Guru^2
Messaggi: 2298
Iscritto: 04/05/2008
|
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 |
internal enum TokenType { Identifier, Integer, Float, Boolean, String, Equals, NotEquals, Greater, Less, INCLUDE, SETGLOBAL, SET, ADD, SUBTRACT, MULTIPLY, DIVIDE, TO, FROM, BY, IF, THEN, ELSE, ENDIF, WHILE, ENDWHILE, CALL, BLOCK, ENDBLOCK, YIELD }
|
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# |
void update() { //........ else if (strCommand == "SayNPC") //Se in un script è presente la riga SayNPC { if (!Other_NPCTALK) //Se qualche altro NPC sta parlando { Talking_Message = (String)listParameters[0]; //testo del messaggio ricavato dai parametri talking = true; //sta parlando Talk((string)listParameters[0]); //Mostra la grafica con la stringa } } else if (strCommand == "WaitKey") //attendi un tasto { if (Input.Keyboard.GetState().IsKeyDown(Input.Keys.Enter)) { talking = false; //sta parlando scriptContext.GlobalVariables["dialog"] = false; //imposta la variabile nello script dialog su false Other_NPCTALK = false; //altri npc parlano false Thread.Sleep(100); //pausa } } }
|
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 |
//ComCode Basic ComCode2.Add("SETGLOBAL Down TO \"Down\""); ComCode2.Add("SETGLOBAL Left TO \"Left\""); ComCode2.Add("SETGLOBAL Right TO \"Right\""); ComCode2.Add("SETGLOBAL Up TO \"Up\""); ComCode2.Add("SETGLOBAL dialog TO FALSE"); //variable del Dialogo ComCode2.Add("SETGLOBAL MoveDown TO \"MoveDown\""); ComCode2.Add("SETGLOBAL MoveUp TO \"MoveUp\""); ComCode2.Add("SETGLOBAL MoveRight TO \"MoveRight\""); ComCode2.Add("SETGLOBAL MoveLeft TO \"MoveLeft\""); ComCode2.Add(string.Format("SetNPCPosition {0} {1}", evx, evy)); ComCode2.Add("WaitKey"); List<string> temp = ReturnComCode(); for (int i = 0; i < temp.Count; i++) { if (temp[i].Contains("\n")) temp[i] = temp[i].Replace("\n", ""); if (temp[i].Contains("-")) { string[] t = temp[i].Split('-'); foreach (string s in t) { ComCode2.Add(s); } } if (temp[i].ToLower().Contains("saynpc")) { ComCode2.Add("SET dialog TO TRUE"); ComCode2.Add(temp[i]); ComCode2.Add("WHILE dialog = TRUE"); ComCode2.Add("WaitKey"); ComCode2.Add("YIELD"); ComCode2.Add("ENDWHILE"); }
|
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 |
SETGLOBAL Down TO "Down" SETGLOBAL Left TO "Left" SETGLOBAL Right TO "Right" SETGLOBAL Up TO "Up" SETGLOBAL dialog TO FALSE //variabile del dialogo SetNPCPosition 224 224 SET dialog TO TRUE SayNPC "ciao pierotofy" WHILE dialog = TRUE WaitKey YIELD 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?
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
|