Domanda

Ho un po ' di gioco scritto in C#.Esso utilizza un database di back-end.È un gioco di carte collezionabili, e volevo implementare la funzione delle carte come uno script.

Quello che voglio dire è che io, essenzialmente, un'interfaccia, ICard, che una scheda di classe implementa (public class Card056: ICard) e che contiene la funzione che è chiamato dal gioco.

Ora, per rendere la cosa gestibile/moddable, vorrei avere la classe per ogni carta come codice sorgente nel database e che, essenzialmente, da compilare al momento del primo utilizzo.Così, quando devo aggiungere/modificare una scheda, ti basta aggiungere al database e dire la mia domanda per l'aggiornamento, senza bisogno di alcuna assemblea di distribuzione (soprattutto perché saremmo a parlare di 1 gruppo per carta, il che significa centinaia di assemblee).

È possibile?Registro di classe da un file di origine e quindi istanziare, etc.

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

Il linguaggio è il C#, ma di bonus extra se è possibile scrivere script in qualsiasi .NET lingua.

È stato utile?

Soluzione

Oleg Shilo C# Script soluzione (in Codice del Progetto davvero è una grande introduzione a fornire script abilità nell'applicazione.

Un altro approccio sarebbe quello di considerare una lingua che è specificamente costruito per la creazione di script, come IronRuby, IronPython, o Lua.

IronPython e IronRuby, sono entrambi disponibili oggi.

Per una guida per l'integrazione dei IronPython leggere Come incorporare IronPython il supporto per gli script nella vostra applicazione esistente in 10 semplici passi.

Lua è un linguaggio di scripting comunemente utilizzato nei giochi.C'è un Lua compilatore .NET, disponibile da CodePlex -- http://www.codeplex.com/Nua

Che codebase è un grande letto se si desidera imparare circa la costruzione di un compilatore .NET.

Una diversa angolazione del tutto è da provare PowerShell.Ci sono numerosi esempi di incorporamento PowerShell in un'applicazione, ecco un'approfondita ricerca sull'argomento:Powershell Tunnel

Altri suggerimenti

Si potrebbe essere in grado di utilizzare IronRuby per che.

Altrimenti vi suggerisco di avere una directory in cui è posto precompilato assemblee.Quindi si potrebbe avere un punto di riferimento nel DB per il montaggio e di classe, e utilizzare la reflection per caricare il corretto assemblee in fase di runtime.

Se si vuole veramente compilare in fase di esecuzione si potrebbe utilizzare il CodeDOM, allora si potrebbe utilizzare la reflection per caricare l'assembly dinamico. La documentazione Microsoft articolo che potrebbe aiutare.

Se non si desidera utilizzare il DLR è possibile utilizzare Boo (che ha un interprete) o si potrebbe prendere in considerazione il Script.NET (S#) progetto su CodePlex.Con il Boo soluzione, potete scegliere tra gli script compilati o utilizzando l'interprete, e Boo fa un bel linguaggio di scripting, è flessibile e la sintassi di un linguaggio estensibile tramite il suo aperto compilatore architettura.Script.NET sembra troppo bello, però, e si potrebbe facilmente estendere la lingua come un progetto open source che utilizza una molto amichevole Compilatore Generatore (Irony.net).

È possibile utilizzare qualsiasi di DLR lingue, che forniscono un modo per davvero facilmente ospitare la tua piattaforma di scripting.Tuttavia, non è necessario utilizzare un linguaggio di scripting per questo.Si potrebbe usare C# e compilare con il codice C# provider.Purché si carica, nel suo dominio di applicazione, è possibile caricare e scaricare al contenuto del vostro cuore.

Suggerirei LuaInterface come ha pienamente attuato Lua dove sembra che Nua non è completo e probabilmente non implementa alcune funzionalità utili (coroutines, ecc).

Se si desidera utilizzare alcuni dei fuori preconfezionati moduli Lua, suggerirei qualcosa lungo le linee di 1.5.x rispetto a 2.x la serie che si basa completamente il codice gestito e non può esporre il necessario C API.

Sto usando LuaInterface1.3 + Lua 5.0 per una NET 1.1 dell'applicazione.

Il problema con Boo è che ogni volta che si analizza/compilare/eval il codice al volo, crea una serie di boo classi in modo da otterrete perdite di memoria.

Lua in mano, non fare questo, quindi è molto molto stabile e funziona meraviglioso (posso passare gli oggetti da C# a Lua e indietro).

Finora non ho messo in PROD ancora, ma sembra molto promettente.

Ho avuto problemi di perdite di memoria in PROD utilizzando LuaInterface + Lua 5.0, quindi ho usato Lua 5.2 e collegata direttamente in C# con DllImport. Le perdite di memoria sono stati all'interno del LuaInterface biblioteca.

Lua 5.2:da http://luabinaries.sourceforge.net e http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

Una volta che ho fatto questo, tutte le mie perdite di memoria erano andati e l'applicazione era molto stabile.

L'applicazione principale che la mia divisione che vende qualcosa di molto simile a fornire al cliente personalizzazioni (il che significa che non è possibile pubblicare qualsiasi fonte).Abbiamo un'applicazione C# che carichi dinamici VB.NET script (anche se qualsiasi .NETTO della lingua potrebbe essere facilmente sostenuto - VB è stata scelta perché la personalizzazione squadra veniva da un ASP di sfondo).

Utilizzando .NET CodeDom abbiamo compilare gli script di database, utilizzando il VB CodeDomProvider (fastidiosamente impostazione predefinita .NET 2, se si desidera il supporto 3.5 funzioni di cui hai bisogno per passare un dizionario con "CompilerVersion" = "v3.5" per il suo costruttore).Utilizzare il CodeDomProvider.CompileAssemblyFromSource metodo per la compilazione (si può anche passare le impostazioni a forza di compilare soltanto nella memoria.

Questo sarebbe il risultato in centinaia di assemblee in memoria, ma si potrebbe mettere tutte le classi dinamiche codice insieme in un unico assembly, e ricompilare il tutto quando qualsiasi cambiamento.Questo ha il vantaggio che si potrebbe aggiungere un flag di compilazione su disco con un PDB quando si esegue il test, che consente di eseguire il debug tramite il codice dinamico.

Sì, ci ho pensato, ma presto ho capito che un altro Dominio-Specifici di Linguaggio (DSL) sarebbe un po ' troppo.

Essenzialmente, hanno bisogno di interagire con il mio controllore possibilmente in modi imprevedibili.Per esempio, una carta può avere una regola "Quando questa carte di entrare in gioco, tutti i tuoi servitori non morti guadagno +3 attacco contro i nemici volanti, tranne quando il nemico è benedetto".Come i giochi di carte collezionabili sono a turni, il Controllore Manager fuoco OnStageX eventi e lasciare che le carte modificare altre carte o il Controllore in qualunque modo la scheda ha bisogno.

Se provo a creare una connessione DSL, devo implementare un piuttosto ampio set di funzionalità e, eventualmente, in costante aggiornamento, che sposta i lavori di manutenzione di un'altra parte senza la rimozione.

Ecco perché ho voluto stare con un "reale" .NET linguaggio essenzialmente essere in grado di accendere l'evento e lasciare che la carta di manipolare il controllore in qualunque modo (entro i limiti di sicurezza dall'accesso di codice).

La prossima versione di .NET (5.0?) ha avuto un sacco di parlare di apertura del compilatore "as a service", che avrebbe reso le cose come diretta script valutazione possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top