21/03/21 9:21
Thejuster
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
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
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
i.ibb.co/qWZqS6z/…
2) Creo un semplice dialogo tipo ciao pierotofy
i.ibb.co/JQ2FY64/…
3) Salvando la mappa di gioco attuale, entra il comcode in azione generando uno script
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
ma cosa succede?
Appena avvio il client di gioco ecco cusa accade
i.ibb.co/QkKFTxH/…
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
mediafire.com/file/g1kupxwzop6udub/bandicam_2021-03-21_10-33-55-572.mp4/…
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
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
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
i.ibb.co/qWZqS6z/…
2) Creo un semplice dialogo tipo ciao pierotofy
i.ibb.co/JQ2FY64/…
3) Salvando la mappa di gioco attuale, entra il comcode in azione generando uno script
//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
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
i.ibb.co/QkKFTxH/…
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
mediafire.com/file/g1kupxwzop6udub/bandicam_2021-03-21_10-33-55-572.mp4/…
Ultima modifica effettuata da Thejuster 21/03/21 9:32
mire.forumfree.it/ - Mire Engine
C# UI Designer
C# UI Designer