2010-01-01 10 views
5

¿Es posible usar jint para manipular un entorno 3D creado con XNA (C#) y para agregar funcionalidad a este entorno (usando jint)?Jint + XNA (C#)

+0

Una pregunta importante es esta: ¿quieres que tu aplicación se ejecute en xbox? si es así, tu elección se reduce bastante – Martin

+0

No realmente. Solo me importa que funcione en una PC. – user241949

Respuesta

1

Eche un vistazo a this SO question, teniendo en cuenta cómo elegir una plataforma de scripting para .Net.

En general, seguro que puede crear un motor de scripting en su aplicación XNA. Usar un motor de secuencias de comandos y proporcionar enganches en su aplicación no es muy diferente de llamar a ensambles externos a través de interfaces públicas.

2

Jint es una opción, es una opción LUA echa un vistazo a LuaForge

LUA es un muy divertido y fácil de usar el lenguaje, con buen soporte para multitarea cooperativa (co-rutinas). Su tipo de datos básicos es una tabla (que es un cruce entre un diccionario y una matriz) que es muy flexible y potente.

Aquí hay algo que escribí justo ahora solo para probarlo. Estoy registrando una función para el script llamado GTest que se asigna a un método C# en mi objeto llamado LUA_GTest. El método acepta un objeto general, y en el script le paso una tabla que contiene una tabla que contiene una cadena que representa un doble. En C# estoy desenvolviendo todo y devolviendo un valor basado en el doble valor.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.Run(); 
    } 

    private void Run() 
    { 
     Lua lua = new Lua(); 
     var methodInfo = typeof(Program).GetMethod("LUA_GTest", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
     lua.RegisterFunction("GTest", this, methodInfo); 
     lua.DoString("GTest({{\"3.3\"}})"); 
    } 

    private double LUA_GTest(object d) 
    { 
     Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     while (d is LuaTable) 
     { 
      d = ((LuaTable)d)[1]; 
      Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     } 
     if (d is string) 
     { 
      d = double.Parse((string)d); 
      Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     } 
     if (d is double) 
      return (double)d * 2; 
     return 0; 
    } 
} 
+0

Nice - Lua necesita más exposición para soluciones .net. –

3

Como contribuyente a Jint, recomendaría que Jint. Jint lo hace más simple que lo que hace Lua. Además, no sé si esto es posible con Lua, pero puedes darle objetos .NET y jugar con ellos en javascript (Jint significa Javascript INTpreter). También puede proteger su aplicación con el conjunto de permisos. Aquí está el mismo código proporcionado anteriormente con Jint:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.Run(); 
    } 

    private void Run() 
    { 
     JintEngine engine = new JintEngine(); 
     engine.SetFunction("GTest", new Jint.Delegates.Func<object, double>(LUA_GTest)); 
     engine.Run("GTest([['3,3']])"); 
    } 

    private double LUA_GTest(object d) 
    { 
     Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     while (d is ArrayList) 
     { 
      d = ((ArrayList)d)[0]; 
      Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     } 
     if (d is string) 
     { 
      d = double.Parse((string)d); 
      Console.WriteLine("Got {0} - {1}", d.GetType().ToString(), d.ToString()); 
     } 
     if (d is double) 
      return (double)d * 2; 
     return 0; 
    } 
} 
+0

Hola Nicholas. Gracias por la publicacion. Realmente no he trabajado con la integración de scripts con un lenguaje .net antes. ¿Puedes darme un ejemplo de cómo podría manipular objetos en 3D (creados con C#) usando jint? Gracias – user241949

+0

Hola, Seguramente puedo dártelo, pero creo que necesitaría una larga discusión sobre cómo hacer que estén disponibles en Jint: La primera posibilidad es hacer que el objeto del juego esté disponible directamente en Jint: Motor JintEngine = new JintEngine(). SetParameter ("juego", tuGameObject); La otra posibilidad es declarar solo los objetos que necesita. Por supuesto, esta forma es mucho menos dinámica. Depende de usted, y también depende de sus necesidades. Si desea analizar más sobre él, cree un hilo en http://jint.codeplex.com/Thread/List.aspx –

+0

¡Gracias de nuevo! – user241949