Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Codice per leggere "if,for ecc.." da script

    Ciao a tutti.
    Da un paio di giorni per varie esigenze sto' cercando di fare una sorta di lettore di
    script (con sintassi apposita).
    Ora, ho finito la parte dove deve eseguire i comandi e gli if a riga singola
    -----
    ES:
    IF(Timer.IsTimeFinish(t1))
    This.MoveTo(xFP;yFP)
    -----
    Ora il problema sta nel trattare degli IF su più righe ed, eventualmente annidati e i for.
    Adesso vorrei concentrarmi sugli if in quanto i for ho una mezza idea di come farli.
    Vorrei delle idee su come farli tenendo conto che per leggere lo script il codice è di questo tipo:
    -Salvataggio script in una lista di stringhe (ogni riga 1 comando)
    -con un for passo tutte le stringhe e le passo una a una in un interprete che esegue il comando.
    Il controllo per l'if dovrebbe essere quindi al livello del for.

    Scusate se non mi sono spiegato bene ma è un po' complicato :master: .
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dato che e' complicato, spiegati meglio, altrimenti non si sa cosa risponderti ...

    E soprattutto, indica il linguaggio che stai utilizzando ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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.

  4. #4
    Ok,mi è venuta l'ispirazione per l'IF annidato,provato e funziona .

    Praticamente ho cambiato la sintassi dell'IF mettendoci alla fine il numero di righe che comprende.Ho passato le righe relative all'if usando la ricorsività e adesso funzionano anche gli if annidati .

    codice:
    
           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;
                bool result = false;
                bool wasIf = false;
                for (int i = currIndex; i < currentScript.Count; i++)
                {
                    if (currentScript[i].Trim().StartsWith("IF"))
                    {
                        int count = Convert.ToInt32(currentScript[i].Trim().Split('$')[1]);                     
                        wasIf = true;
                        string s1 = currentScript[i].Remove(0, 3);
                        string s2="";
                        if (count < 10)
                            s2 = s1.Remove(s1.Length - 3, 3);
                        else
                            s2 = s1.Remove(s1.Length - 4, 4);
                        if (result = Execute(s2, callerObject, ref gameObject, ref scriptList, ref scriptVarList, ref scriptVars, gameTime))
                        {
                            List<string> ToPass = new List<string>();
                            for(int j=i+1;j<=i+count;j++)
                                ToPass.Add(currentScript[j]);
                            i += count;
                            Interpreter(ToPass,0,callerObject,ref gameObject,ref scriptList,ref scriptVarList,ref scriptVars,gameTime);
                        }
                        else
                        {
                            jumpLine = true;
                        }
                        if (jumpLine)
                        {
                            i += count;
                        }                    
                    }
                    else
                    {
                        result = Execute(currentScript[i], callerObject, ref gameObject, ref scriptList, ref scriptVarList, ref scriptVars, gameTime);
                    }
                    if (!result&&!wasIf)
                    {
                        StaticVar.GameComponent.DebugList.Add(currentScript[i].Trim());
                    }              
                }
            }
    
    Adesso faccio il for e poi dovrei aver finito.
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.