Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Come trovare un problema che non si trova?
Forum - C# / VB.NET - Come trovare un problema che non si trova?

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:05
Mercoledì, 10/01/2018
Buongiorno ragazzi.
Vorrei dei consigli ma magari anche una mano per riuscire a risolvere un misterioso problema
che mi sta affliggendo ultimamente sul mio motore.

Faccio un pò il riassunto della situazione.

Tramite il mio editor è possibile grazie a dei nodi visuali generare codice inline che successivamente
l'engine interpreterà con un interprete scritto apposta leggendo i vari token e statments.

Come funziona?

https://s14.postimg.org/yjy6vb0sh/Immagine.png


Nel messagebox si può osservare il codice generato dai nodi.

Fin quando utilizzo un solo NPC generato dal programma, funziona correttamente.
Cammina, parla, segue un percorso ed esegue azioni.

Se Creo 2 NPC che si muovono unicamente sulla mappa senza parlare, funziona.

http://recordit.co/nXRb4JRh66


Il problema è in questa funzione


Codice sorgente - presumibilmente C# / VB.NET

  1. else if (strCommand == "SayNPC")
  2.                   {
  3.                       if (!Other_NPCTALK)
  4.                       {
  5.                           Talking_Message = (String)listParameters[0];
  6.                           talking = true;
  7.  
  8.                           Talk((string)listParameters[0]);
  9.                       }
  10.  
  11.                       //m_textWindow.Say(this, (String)listParameters[0], (int) listParameters[1]);
  12.                   }


1° Verifica il comando registrato.
2° Prende il parametro stringa "Messaggio NPC"
3° Imposta talking su True;



Nel Motore alla parte del render

Codice sorgente - presumibilmente C# / VB.NET

  1. //FACCIO PARLARE GLI NPC
  2.                    //Solo se qualcuno di quelli non sta già parlando
  3.                     for (int i = 0; i < NPC.Count; i++)
  4.                     {
  5.                         if (NPC[i].talking && NPC_TALK == false)
  6.                         {
  7.                             dialog(NPC[i].Talking_Message);
  8.                         }
  9.                     }




Stranamente appena si avvia, Crasha restituendomi un Null reference exception.
E mi domando come sia possibile una cosa del genere.

Se un solo NPC funziona senza problemi, perché aggiungendone altri crasha?

https://s14.postimg.org/pq7ae58o1/Immagine.png

Ho osservato tutte le variabili che l'interpreta sfrutta.
perché l'errore viene scaturito proprio nella classe dell'interprete.

Non può essere un errore di scrittura perché il codice viene generato.
Quindi se funziona con un solo npc dovrebbe funzionare anche con 100

Non sò, forse si accavalla il draw? ma mi sembra assurda come ipotesi.
Anche perché potrei disegnare quante sprite voglio non avrei problema.
E gli NPC si autogestiscono da soli.

Qualche soluzione? o magari idea?


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:54
Mercoledì, 10/01/2018
Tu scrivi:

Faccio parlare gli NPC se non stanno già parlando, ma poi scrivi:
if (NPC.talking && NPC_TALK == false)

Mi aspetterei invece:
if (!NPC.talking && NPC_TALK == false)

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:04
Giovedì, 11/01/2018
Non avevo fatto caso a questo errore, come ho risolto non era quello.
Grazie per la segnalazione Darkjuster, in un progetto grande alcune cose possono completamente sfuggirmi.
nonostante il tuo aiuto, il problema era altrove.

Ho risolto in questo modo dopo ore ed ore di tentativi.

Visual studio dando l'errore del NullReference Exception
non mi è stato di molto aiuto. anzi per niente.
Mi ha solo confuso le idee credendo che davo qualche valore null
o non leggeva bene il comando.

Riguardando bene le screen, ho notato una cosa.
Sopratutto guardando la gif che ho messo, quella su recordit.

https://s14.postimg.org/ylw0noj9d/Immagine.png

Ho cerchiato di rosso il problema.

A runtime il render è veloce e non si nota.
Ma sulla gif ho notato la doppia ombra questo mi dava a pensare che c'erano 2 NPC
sullo stesso punto che eseguivano le stesse azioni.
Controllando dal debugger infatti era proprio così.

Non so come è perché la L'initialize della scena viene fatta due volte.
dovrò indagare su questa cosa.

Ma poi pensando, bhe cosa cambia se c'è uno o due npc sullo stesso punto?
cmq funzionano autonomamente da soli.

ho tentato lo stesso a rimuoverne uno, e successivamente l'errore è cambiato.
Invece di NullReferenceException mi dava errore al font.
L'npc tentava di scrivere senza il font. anche questa è una cosa abbastanza strana.
perché al loading faccio caricare prima tutti i componenti e file necessari per gli script e l'interprete.

Il problema alla fine era una banalità.
Avendo fatto un overload della classe principale,
andavo a settare si il font ma alla variabile sbagliata. non a quella dell'npc ma alla classe del motore
ereditata dall'npc...

Errori banali che poi portano ad un disastro completo.

Ed ecco qui alla fine il problema risolto

https://s14.postimg.org/qgdypyia9/Immagine.png



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 3:38
Lunedì, 15/01/2018
Non mi sarebbe mai venuto in mente niente del genere, e non ho abbastanza spirito di osservazione per notare una doppia ombra.

Comunque sono felice di averti segnalato un altro problema. Magari ti ho risparmiato qualche oretta di debug.

PM Quote