Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
guarda quella in basso non quella in alto.
l'utente vedrà la listbox non il codice generato.
esempio:
facendo doppio click sull'elemento " <> " in fondo
si apre una lista di scelte e appaiono pulsanti che cliccandoci sopra si aprono schermate per configurare un azione
in questo esempio c'è Message: bla bla bla
l'utente inserirà in una textbox il messaggio da visualizzare,
mentre in background viene generato il codice in una sola linea
che sarebbe
Dialog("Testo inserito dall'utente")
mentre l'utente visualizzerà
Message: Testo inserito dall'utente
insomma tutto questo per rendere più user-friendly la cosa.
ora lo script in lua che ho postato prima, e il funzionamento corretto che dovrebbe avere lo script.
però non posso generare quel macello, ho bisogno di fare tutto solo su una righa di codice.
Quindi ho registrato la funzione Dialog("")
che mi và a chiamare quel void in C#
Quello che succede, è che si frezza il programma non mostrato il testo.
Quello che dovrebbe fare,
è mostrare il dialogo che sarebbe questo.
Ok, se quello script funziona, solo quando è inline, e non quando è incluso in una funzione registrata allora:
1) lo script fa riferimento a cose che sono fuori dalla funzione
2) la registrazione non è andata a buon fine
Io credo che il problema sia il numero 1, ma hai qualche modo per assicurarti che non sia il 2?
Comunque:
Codice sorgente - presumibilmente C# / VB.NET
/// <summary>
/// Mostra un messaggio di gioco
/// </summary>
/// <param name="text">testo del messaggio</param>
consiglio di apportare quei piccoli cambiamenti per:
1) rendere il codice più leggibile e facile da testare
2) sbarazzarsi (elegantemente) di quel flag dialogo_letto
3) evitare goto
Appena riesci dammi ulteriori dettagli
Ultima modifica effettuata da TheDarkJuster il 24/05/2016 alle 21:05
In pratica ho la libreria del lua nativa, ma con un altra libreria che funge da wrapper per richiamare le funzioni nella libreria nativa.
In pratica questa versione che ho e molto performante rispetto a quelle che girano normalmente nella rete.
è molto più stabile e veloce.
difatti gli script vengono chiamata nell'update quindi puoi immaginare la velocità di chiamata e la risposta immediata dall'interprete.
anche con script complessi riesco ad ottenere un fps molto ma molto stabile e fisso sui 60.
cmq non credo che sia un problema di libreria.
Quando aziono la chiamata
esempio:
Codice sorgente - presumibilmente Plain Text
lua.DoString("Dialog(\"Ciao lumo\")");
il dialogo nell'engine appare e scompare velocissimo.
perché una volata che il metodo viene processato ed eseguito, l'engine continua il suo normale ciclo di renderizzazione.
se creo un ciclo per mostrare continuamente il dialogo, il programma si congela.
Perché esegue direttamente lo script e non il metodo Draw dell'engine.
Il mio motore funziona così:
[ Inizio ] -> [ Main.lua ] ( Configurazioni varie ed importazioni di eventuali sub-class del lua )
[Scene State]
A seconda della scena impostata dall'enumeratore, si può cambiare il flag di rendering.
ed effettuare lo switch tra un Wiewport ed un'altro.
Ogni Viewport inquadra una scena, ed il draw del relativo viewport viene ovviamente cambiato quando serve.
e non fatto girare a vuoto, così ne guadagno di prestazioni.
Il redering generale funziona in questo modo.
Metodo Initialize
1) Decompressione binaria dei file
2) Caricamento a RunTime di Texture estratte dai file binari.
3) Caricamento di Mappe Normali e Diffuse delle sprite.
Metodo Update / Draw
4) Inizio del Rendering
5) Entra in azione il PixelShader
6) Entra in azione lo shader ShadowMap
7) Entra in azione lo shader 2D Deferred Lighting
8) Update del Viewport e renderizzazione della scena di gioco, Player, eventi, collisioni ecc. ecc.
9) Update del lua engine ( lua.DoString("Scene_Game.Update"); )
per eseguire eventuali script creati dagli utenti ed interpellati nella Scene_Game.lua globale
contenuta nella cartella script/
10) Draw del risultato dei script eseguiti dal lua.
Il problema fondamentale è questo.
Se faccio eseguire una sola volta quel void in C# Dialog
appare e scompare velocissimo.
Se provo a fare un qualcosa molto simile ad un ciclo si congela.
Serve una soluzione.
PS: Non ancora ho provato il metodo di DarkJuster.
Riesci a capire con il debugger dove si blocca? Potrebbe essere che per qualche motivo non riesce a prendere l'invio da tastiera e quindi rimane bloccato (come è giusto che sia, secondo il codice che hai scritto). Potrebbe essere ad esempio che il loop che hai messo prenda tutta la CPU e non lasci context switch all'input handler, prova invece che lasciarlo vuoto a metterci dentro uno sleep di qualche centinaio di millisecondi.
può anche darsi che con il mio codice risolvi: non ridisegni la stessa cosa migliaia di volte al secondo!
Cosa che ovviamente era un enorme "cattivo comportamento", se non addirittura bug....
Appena provato.
Anche il metodo di DarkJuster non sembra funzionare.
và in blocco anche con quel metodo.
c'è qualcosa che non quadra..
Con lo sleep ottengo lo stesso risultato. ovviamente si frezza il thread.
però ho notato che solo dopo che ha completato il Thread.Sleep(2000) appare il messaggio.
Eppure è strano. Perché il Thread.Sleep è posto alla fine del void non all'inizio.
Ho provato ad osservare cosa succede con il debbuger con l'evento di DarkJuster.
Il programma rimanere fermo su
return Keyboard.GetState();
e come se il ciclo while bloccasse completamente tutto il processo.