Allora, sto' utilizzando C#.
Vi mostro un esempio di "script" (in linguaggio inventato) così si capisce meglio.
codice:
IF(Timer.IsTimeFinish(t1)) //se il timer t1 è finito
This.MoveTo(xFP;yFP) //sposta l'oggetto a xFP;yFP
IF(Timer.IsTimeFinish(t1)) //se il timer t1 è finito
Float.Add(xFP;2.0f) //aggiunge alla variabile float xFP 2.0
IF(Timer.IsTimeFinish(t1)) //se il timer t1 è finito
Timer.Reset(t1) //lo resetta
Come si vede sopra, attualmente,per eseguire più operazioni che necessitano dello stesso controllo sono costretto a scrivere 3 volte lo stesso l'IF.
Vorrei un'idea di codice per far si che ne basti uno, una cosa tipo:
codice:
IF(Timer.IsTimeFinish(t1)) //se il timer t1 è finito
{
This.MoveTo(xFP;yFP) //sposta l'oggetto a xFP;yFP
Float.Add(xFP;2.0f) //aggiunge alla variabile float xFP 2.0
Timer.Reset(t1) //lo resetta
}
Inoltre vorrei poter mettere degli IF annidati,una cosa del tipo:
codice:
IF(Timer.IsTimeFinish(t1)) //se il timer t1 è finito
{
IF(This.X<20)
{
This.MoveTo(xFP;yFP) //sposta l'oggetto a xFP;yFP
Float.Add(xFP;2.0f) //aggiunge alla variabile float xFP 2.0
Timer.Reset(t1) //lo resetta
}
}
Avevo pensato a un ciclo ricorsivo ma non so' come impostarlo.
Attualmente il codice in C# che uso per leggere lo script è questo (probabilmente ha dei bug assurdi :
codice:
/* currentScript : script che si sta elaborando
/* currIndex : posizione (riga) corrente nello script (non l'ho usata ancora)
/* callerObject : oggetto a cui è assegnato lo script (per usare "This." devo sapere da chi parte il comando)
/* gameObject : hashtable contenente gli oggetti a cui sono assegnati degli script
/* scriptList : la lista degli script
/* scriptVarList : la lista dei nomi delle variabili create (nome ; tipo)
/* scriptVars : la lista delle variabili create (nome ; valore)
/* ----Execute : metodo che elabora la stringa,restituisce True se non ci sono errori
o se l'istruzione è vera (in caso di IF),false se ci sono errori o se l'istr. è falsa (in caso di IF)
*/
private static void Interpreter(List<string> currentScript,int currIndex, string callerObject, ref Hashtable gameObject, ref Hashtable scriptList, ref Hashtable scriptVarList, ref Hashtable scriptVars,GameTime gameTime)
{
bool jumpLine = false; //controlla se deve saltare la riga successiva (if a riga singola)
bool result = false; //risultato del metodo Execute
bool wasIf = false; //controlla se l'istruzione era un if
for (int i = 0; i < currentScript.Count; i++)
{
if (currentScript[i].Trim().StartsWith("IF"))
{
wasIf = true; //è un IF
string s1 = currentScript[i].Remove(0, 3); //pulisce la stringa per elaborarla
string s2 = s1.Remove(s1.Length - 2, 1); //togliendo "IF" e parantesi finale
if (result = Execute(s2, callerObject, ref gameObject, ref scriptList, ref scriptVarList, ref scriptVars, gameTime))
{
jumpLine = false; //se il risultato dell'IF è vero,non deve saltare una riga
}
else
{
jumpLine = true; //se il risultato dell'IF è falso,deve saltare una riga
//non ho messo i++ qui dentro perchè poteva servirmi
//per altre cose
}
if (jumpLine)
{
i++;
}
}
else
{
//se non è un if esegue direttamente il comando,in questo caso
result è falso se avvengono errori
result = Execute(currentScript[i], callerObject, ref gameObject, ref scriptList, ref scriptVarList, ref scriptVars, gameTime);
}
if (!result&&!wasIf)
{
//se ci sono errori li segnala in una lista (che poi viene visualizzata in una form)
StaticVar.GameComponent.DebugList.Add(currentScript[i].Trim());
}
}
}
Qualche idea su come implementare IF annidati e su più righe?
Grazie.