Oppure

Loading
23/01/18 17:13
Thejuster
ragazzi volevo mostrarvi questo problema che mi sta affliggendo da stamattina.

data una stringa:

"Hello ?c[1]man ?c[10]how are you?"


tramite Regex elimino il tag dalla stringa, e recupero il valore contenuto nelle parentesi
che equivale al codice di un colore.

Il problema e quando vado a scrivere sulla coordinata che mi sballa completamente tutto.

media.discordapp.net/attachments/227530413063536641/405409103783919628/…


Sbaglio sicuramente il calcolo per posizionare tutto.

vi mostro il codice


                string[] t = Regex.Split(text, @"\?c\[\w+\]");
                string[] a = Regex.Split(text, @"\[(.*?)\]");
                
                for (int i = 0; i < a.Length; i++)
                {
                    if (a[i].Contains("?c"))
                    {
                        a[i] = a[i].Replace("?c", "");
                    }
                }


                int? colore = 0;
                int newx;
                for (int i = 0; i < a.Length; i++)
                {
                    try { colore = Convert.ToInt16(a[i]); i++; }
                    catch { };

                    //newx = x + (i* 65);
                    newx = x + (i * 30);
                    if (colore != 0 || colore != null)
                    {
                        Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.White);
                    }
                    if (colore == 10)
                    {
                        Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Gold);
                    }
                    if (colore == 1)
                    {
                        Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Red);
                    }
                    if (colore == 2)
                    {
                        Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Blue);
                    }
                }



Consigli?

EDIT:

Se vi domandate perché faccio questa operazione


 try { colore = Convert.ToInt16(a[i]); i++; }
                    catch { };



ecco il motivo

media.discordapp.net/attachments/227530413063536641/405411792077062146/…
Ultima modifica effettuata da Thejuster 23/01/18 17:21
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/01/18 17:21
Roby94
Vado ad intuizione, quindi probabilmente sbaglierò...
Il tuo problema sarebbe che "hello man how..." presenta delle spaziature anomale?
newx = x + (i * 30);
quel 30 mi pare parecchio arbitrario
Se invece il problema è la sovrapposizione con la risposta allora questo codice non basta
Ultima modifica effettuata da Roby94 23/01/18 17:22
aaa
23/01/18 17:26
Thejuster
Postato originariamente da Roby94:

Vado ad intuizione, quindi probabilmente sbaglierò...
Il tuo problema sarebbe che "hello man how..." presenta delle spaziature anomale?
newx = x + (i * 30);
quel 30 mi pare parecchio arbitrario
Se invece il problema è la sovrapposizione con la risposta allora questo codice non basta


no, non presenta spazi anomali.

i*30 ho usato questo metodo per separare i caratteri uno dall'altro
altrimenti esce tutto attaccato.

questo perché è l'utente tramite script che decide quante parole o righe voler mostrare di un colore.

il codice che stampa il testo è unicamente quello.
nulla più

la funzione javascript va ad azionare quel metodo inviando i parametri come X,y e stringa

la funzione javascript è questa, ovvero che il motore interpreta



Scene_Menu.prototype.Update = function()
{

  this.bitmap.DrawText(50,50,"Hello ?c[1]man ?c[10]how are you? ?c[2]Im fine tanks");

};




Questo è quanto 8-| non sò proprio dove sbattere la testa
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/01/18 17:32
Roby94
Scusa, sarò rimbambito io ma non riesco a capire quale sia il problema; potresti spiegarmelo con altre parole, per favore.
aaa
23/01/18 18:29
Thejuster
Certo,
Guarda le screen


1° di default dovrebbe apparire in questo modo.

Dico default perché quando l'utente tenta di scrivere del testo senza nessun tag, appare perfettamente.
perché il motore non ha bisogno di applicare colori a deterimante parole.

s10.postimg.org/lv8gr7hm1/…

Quindi sfrutta un semplicissimo DrawText su coordinate X e Y.

come tag intendo, un comando che viene impartito tramite script.
Perché il mio motore ha un interprete di Javascript.

Questo è il comando per scrivere testo



//SCRIPT
//                              X  Y      TEXT                                
this.bitmap.DrawText(50,50,"Hello man how are you? im fine tanks");



che và a richiamare questa funzione




 /// <summary>
        /// Disegna del testo in specifiche coordinate
        /// </summary>
        /// <param name="x">X</param>
        /// <param name="y">Y</param>
        /// <param name="text">Testo</param>
        /// <param name="color">Colore Opzionale</param>
        public void draw_text(int x, int y, string text,int color = 0)
        {
 
          //........

 

             Batch.DrawString(debugFont, text, new Vector2(x, y), Color.White); //Default White

       
        }




Successivamente sto cercando di dare all'utente la possibilità di colorare
determinate parole aggiungendo dei tag nella stringa

Però a differenza della semplice funzione scritta sopra.
Questo metodo và a scrivere lettera per lettera e colorare solo quelle indicate nella stringa tramite vari tag

ad esempio

Tag: ?c[10] = Colore Oro
?c[1] = Colore Rosso
?c[2] = Colore Blu


quindi se esempio faccio da script


//SCRIPT

this.bitmap.DrawText(50,50,"Hello man ?c[10]how are you? ?c[1]im fine tanks");




tramite Regex e un ciclo for vado a sistemare la stringa in 2 array.



                //Recupero il codice del colore contenuto nelle parentesi, ma splittando mi rimanre ?c 
               //Oltre a prendermi il codice del colore mi mette in array anche le varie parole.
                string[] a = Regex.Split(text, @"\[(.*?)\]");
                
                for (int i = 0; i < a.Length; i++)
                {
                    if (a[i].Contains("?c"))
                    {
                        a[i] = a[i].Replace("?c", ""); //Se è presente ?c nella stringa lo rimuovo.
                    }
                }




Successivamente vado a scrivere a video



                int? colore = 0;
                int newx;

                
                for (int i = 0; i < a.Length; i++)
                {
                    try { colore = Convert.ToInt16(a[i]); i++; } //Vado a prendere dall'array "a" il codice del colore
                    catch { };

                    
                    newx = x + (i * 30); //Spazio tra un carettere e l'altro

                    if (colore != 0 || colore != null)
                    {
                        //Se il codice colore è 0 o nullo scrivilo bianco.
                        spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.White);
                    }
                    if (colore == 10) //Colore oro
                    {
                        spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Gold);
                    }
                    if (colore == 1) //Colore Rosso
                    {
                        spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Red);
                    }
                    if (colore == 2) //Colore blu
                    {
                        spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Blue);
                    }
                }




Qui c'è il problema
Stranamente mi mostra degli spazi come se il testo venisse giustificato centralmente.
e non sò perché
forse sarà qualche problema dovuto a newx = x + (i * 30);
non saprei, ma più aumento il valore, più si distaccano le parole.
ottenendo questo effetto

s10.postimg.org/4yjdysphl/…

Oltretutto noto un incredibile calo di fps.

Se ad esempio metto

x + ( i * 65 )

s10.postimg.org/j4z4u5q3t/…

C'è qualche altro modo per fare questo?
ho preso spunto da questo sito

unknowncheats.me/forum/direct3d/…



EDIT:
provando diversamente, ho recuperato in termini di prestazioni,
ma cmq rimane sfasato


  int colore = 0;
                int newx;
                int tot = 0;
                for (int i = 0; i < a.Length-1; i++)
                {
                    int.TryParse(a[i], out colore);

                    if (colore == 0)
                    {
                        char[] arr = a[i].ToCharArray();

                        for (int j = 0; j < arr.Length; j++)
                        {
                            tot += x + j - 40;
                            spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.White);
                           
                        }
                        
                        continue;
                    }

                    if (colore == 10)
                    {
                        char[] arr = a[i + 1].ToCharArray();
                        for (int j = 0; j < arr.Length; j++)
                        {
                            tot += x + j - 40;
                            spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.Gold);
                        }

                    }




s10.postimg.org/6t1addg61/…
Ultima modifica effettuata da Thejuster 23/01/18 18:54
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/01/18 19:19
Mikelius
Postato originariamente da Thejuster:
if (colore != 0 || colore != null)
{
//Se il codice colore è 0 o nullo scrivilo bianco.
spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.White);
}


Non sarà sicuramente questo, ma il codice qui fa il contrario del commento.

Prova a fare una prova con una frase molto, molto lunga e vedi se c'è una sorta di logica nella spaziatura risultante..
aaa
23/01/18 20:01
Thejuster
Si gli spazi aumentano

s10.postimg.org/ayc6z8o7t/…

la string scritta è questa


  this.bitmap.DrawText(50,50,"Hello man ?c[10] how are you? im fine tanks  and you?");



ho tentanto anche di cambiare la variabile tot da int a float
per avere un maggiore margine di precisione

ma mettendo perfino a 0.0002F
ottengo

s10.postimg.org/9kp5i1h0p/…

ma una cosa è certa, i margini ora sembrano essere uguali e non differenti



tot += x + (j * 0.0002f);

Ultima modifica effettuata da Thejuster 23/01/18 20:13
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/01/18 20:44
Mikelius
Postato originariamente da Thejuster:
la string scritta è questa
this.bitmap.DrawText(50,50,"Hello man ?c[10] how are you? im fine tanks  and you?");



E' giusta?
Non ho trovato nessuna DrawText(int ,int , String).
Scusa se faccio queste domande, ma non vedendo tutto il codice non so come aiutare.
Comunque, a me sembra che la distanza delle lettere aumenti parola per parola...
aaa