Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Coordinate sballate
Forum - C# / VB.NET - Coordinate sballate

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:13
Martedì, 23/01/2018
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.

https://media.discordapp.net/attachments/227530413063536641 ...


Sbaglio sicuramente il calcolo per posizionare tutto.

vi mostro il codice

Codice sorgente - presumibilmente C# / VB.NET

  1. string[] t = Regex.Split(text, @"\?c\[\w+\]");
  2.                 string[] a = Regex.Split(text, @"\[(.*?)\]");
  3.                
  4.                 for (int i = 0; i < a.Length; i++)
  5.                 {
  6.                     if (a[i].Contains("?c"))
  7.                     {
  8.                         a[i] = a[i].Replace("?c", "");
  9.                     }
  10.                 }
  11.  
  12.  
  13.                 int? colore = 0;
  14.                 int newx;
  15.                 for (int i = 0; i < a.Length; i++)
  16.                 {
  17.                     try { colore = Convert.ToInt16(a[i]); i++; }
  18.                     catch { };
  19.  
  20.                     //newx = x + (i* 65);
  21.                     newx = x + (i * 30);
  22.                     if (colore != 0 || colore != null)
  23.                     {
  24.                         Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.White);
  25.                     }
  26.                     if (colore == 10)
  27.                     {
  28.                         Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Gold);
  29.                     }
  30.                     if (colore == 1)
  31.                     {
  32.                         Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Red);
  33.                     }
  34.                     if (colore == 2)
  35.                     {
  36.                         Batch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Blue);
  37.                     }
  38.                 }



Consigli?

EDIT:

Se vi domandate perché faccio questa operazione

Codice sorgente - presumibilmente C# / VB.NET

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


Ultima modifica effettuata da Thejuster il 23/01/2018 alle 18:21


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1147
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:21
Martedì, 23/01/2018
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 il 23/01/2018 alle 18:22
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 18:26
Martedì, 23/01/2018
Testo quotato

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

Codice sorgente - presumibilmente Plain Text

  1. Scene_Menu.prototype.Update = function()
  2. {
  3.  
  4.   this.bitmap.DrawText(50,50,"Hello ?c[1]man ?c[10]how are you? ?c[2]Im fine tanks");
  5.  
  6. };



Questo è quanto 8-| non sò proprio dove sbattere la testa


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1147
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:32
Martedì, 23/01/2018
Scusa, sarò rimbambito io ma non riesco a capire quale sia il problema; potresti spiegarmelo con altre parole, per favore.

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 19:29
Martedì, 23/01/2018
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.

https://s10.postimg.org/lv8gr7hm1/Cattura.png

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


Codice sorgente - presumibilmente Plain Text

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



che và a richiamare questa funzione



Codice sorgente - presumibilmente C#

  1. /// <summary>
  2.         /// Disegna del testo in specifiche coordinate
  3.         /// </summary>
  4.         /// <param name="x">X</param>
  5.         /// <param name="y">Y</param>
  6.         /// <param name="text">Testo</param>
  7.         /// <param name="color">Colore Opzionale</param>
  8.         public void draw_text(int x, int y, string text,int color = 0)
  9.         {
  10.  
  11.           //........
  12.  
  13.  
  14.  
  15.              Batch.DrawString(debugFont, text, new Vector2(x, y), Color.White); //Default White
  16.  
  17.        
  18.         }




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


Codice sorgente - presumibilmente Plain Text

  1. //SCRIPT
  2.  
  3. 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.


Codice sorgente - presumibilmente Python

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




Successivamente vado a scrivere a video


Codice sorgente - presumibilmente C# / VB.NET

  1. int? colore = 0;
  2.                 int newx;
  3.  
  4.                
  5.                 for (int i = 0; i < a.Length; i++)
  6.                 {
  7.                     try { colore = Convert.ToInt16(a[i]); i++; } //Vado a prendere dall'array "a" il codice del colore
  8.                     catch { };
  9.  
  10.                    
  11.                     newx = x + (i * 30); //Spazio tra un carettere e l'altro
  12.  
  13.                     if (colore != 0 || colore != null)
  14.                     {
  15.                         //Se il codice colore è 0 o nullo scrivilo bianco.
  16.                         spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.White);
  17.                     }
  18.                     if (colore == 10) //Colore oro
  19.                     {
  20.                         spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Gold);
  21.                     }
  22.                     if (colore == 1) //Colore Rosso
  23.                     {
  24.                         spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Red);
  25.                     }
  26.                     if (colore == 2) //Colore blu
  27.                     {
  28.                         spriteBatch.DrawString(debugFont, a[i], new Vector2(newx, y), Color.Blue);
  29.                     }
  30.                 }




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

https://s10.postimg.org/4yjdysphl/Cattura.png

Oltretutto noto un incredibile calo di fps.

Se ad esempio metto

x + ( i * 65 )

https://s10.postimg.org/j4z4u5q3t/Cattura.png

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

https://www.unknowncheats.me/forum/direct3d/112365-directx- ...



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

Codice sorgente - presumibilmente C#

  1. int colore = 0;
  2.                 int newx;
  3.                 int tot = 0;
  4.                 for (int i = 0; i < a.Length-1; i++)
  5.                 {
  6.                     int.TryParse(a[i], out colore);
  7.  
  8.                     if (colore == 0)
  9.                     {
  10.                         char[] arr = a[i].ToCharArray();
  11.  
  12.                         for (int j = 0; j < arr.Length; j++)
  13.                         {
  14.                             tot += x + j - 40;
  15.                             spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.White);
  16.                            
  17.                         }
  18.                        
  19.                         continue;
  20.                     }
  21.  
  22.                     if (colore == 10)
  23.                     {
  24.                         char[] arr = a[i + 1].ToCharArray();
  25.                         for (int j = 0; j < arr.Length; j++)
  26.                         {
  27.                             tot += x + j - 40;
  28.                             spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.Gold);
  29.                         }
  30.  
  31.                     }


Ultima modifica effettuata da Thejuster il 23/01/2018 alle 19:54


PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 445
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 20:19
Martedì, 23/01/2018
Testo quotato

Postato originariamente da Thejuster:
if (colore != 0 || colore != null)
                    {
                        //Se il codice colore è 0 o nullo scrivilo bianco.
                        spriteBatch.DrawString(debugFont, a, 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..


"Io ne ho viste cose che voi umani non potreste immaginarvi...."
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 21:01
Martedì, 23/01/2018
Si gli spazi aumentano

https://s10.postimg.org/ayc6z8o7t/Cattura.png

la string scritta è questa

Codice sorgente - presumibilmente C# / VB.NET

  1. 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

https://s10.postimg.org/9kp5i1h0p/Cattura.png

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


Codice sorgente - presumibilmente Plain Text

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


Ultima modifica effettuata da Thejuster il 23/01/2018 alle 21:13


PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 445
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 21:44
Martedì, 23/01/2018
Testo quotato

Postato originariamente da Thejuster:
la string scritta è questa
Codice sorgente - presumibilmente C# / VB.NET

  1. 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...


"Io ne ho viste cose che voi umani non potreste immaginarvi...."
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:55
Mercoledì, 24/01/2018
questa funzione che hai appena scritto è javascript.
Interpretato dal motore.

questa funzione this.bitmap.DrawText va a richiamare la funzione che stiamo trattando nel topic

e la funzione fa unicamente quello nulla di piu

Codice sorgente - presumibilmente C#

  1. /// <summary>
  2.         /// Disegna del testo in specifiche coordinate
  3.         /// </summary>
  4.         /// <param name="x">X</param>
  5.         /// <param name="y">Y</param>
  6.         /// <param name="text">Testo</param>
  7.         /// <param name="color">Colore Opzionale</param>
  8.         public void draw_text(int x, int y, string text,int color = 0)
  9.         {
  10.             StringBuilder sb = new StringBuilder();
  11.  
  12.             if (text.Contains("?c["))
  13.             {
  14.  
  15.  
  16. string[] t = Regex.Split(text, @"\?c\[\w+\]");
  17.                 string[] a = Regex.Split(text, @"\[(.*?)\]");
  18.                
  19.                 for (int i = 0; i < a.Length; i++)
  20.                 {
  21.                     if (a[i].Contains("?c"))
  22.                     {
  23.                         a[i] = a[i].Replace("?c", "");
  24.                     }
  25.                 }
  26.  
  27.  
  28.                 int colore = 0;
  29.                 int newx;
  30.                 float tot = 0f;
  31.                 for (int i = 0; i < a.Length-1; i++)
  32.                 {
  33.                     int.TryParse(a[i], out colore);
  34.  
  35.                     if (colore == 0)
  36.                     {
  37.                         char[] arr = a[i].ToCharArray();
  38.  
  39.                         for (int j = 0; j < arr.Length; j++)
  40.                         {
  41.                             tot += x + (j * 0.0002f) - 25;
  42.                             spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.White);
  43.                            
  44.                         }
  45.                        
  46.                         continue;
  47.                     }
  48.  
  49.                     if (colore == 10)
  50.                     {
  51.                         char[] arr = a[i + 1].ToCharArray();
  52.                         for (int j = 0; j < arr.Length; j++)
  53.                         {
  54.                             tot += x + (j * 0.0002f) - 25;
  55.                             spriteBatch.DrawString(debugFont, arr[j].ToString(), new Vector2(tot, y), Color.Gold);
  56.                         }
  57.  
  58.                     }
  59.  
  60.              }
  61.  
  62.     }




PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo