2010-01-01 2 views
5

Ist es möglich, jint zu verwenden, um eine mit XNA (C#) erstellte 3D-Umgebung zu bearbeiten und dieser Umgebung Funktionalität hinzuzufügen (wiederum unter Verwendung von jint)?Jint + XNA (C#)

+0

Eine wichtige Frage ist dies: Möchten Sie Ihre App auf xbox ausführen können? Wenn ja, ist Ihre Wahl ziemlich stark reduziert – Martin

+0

Nicht wirklich. Ich sorge mich nur darum, dass es auf einem PC läuft. – user241949

Antwort

1

Schauen Sie sich this SO question an und überlegen Sie, wie Sie eine Skriptplattform für .Net auswählen.

Im Allgemeinen können Sie sicher ein Skriptmodul in Ihre XNA-Anwendung erstellen. Die Verwendung einer Skript-Engine und das Bereitstellen von Hooks in Ihrer App unterscheidet sich nicht wesentlich von dem Aufruf externer Assemblys über öffentliche Schnittstellen.

2

Jint ist eine Option, ist LUA eine Option aus überprüfen LuaForge

LUA ein wirklich Spaß und ist einfach zu verwendende Sprache, mit netter Unterstützung für kooperatives Multitasking (Koroutinen). Der grundlegende Datentyp ist eine Tabelle (eine Kreuzung zwischen einem Wörterbuch und einem Array), die sehr flexibel und leistungsfähig ist.

Hier ist etwas, das ich gerade geschrieben habe, nur um es zu testen. Ich registriere eine Funktion für das Skript mit dem Namen GTest, das auf eine C# -Methode in meinem Objekt namens LUA_GTest verweist. Die Methode akzeptiert ein allgemeines Objekt, und im Skript übergebe ich eine Tabelle mit einer Tabelle, die eine Zeichenfolge enthält, die ein Double repräsentiert. In C# packe ich alles aus und gebe einen Wert basierend auf dem doppelten Wert zurück.

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

Schön - Lua braucht mehr Belichtung für .net-Lösungen. –

3

Als Beitrag zur Jint, würde ich Ihnen empfehlen Jint. Jint macht es einfacher als das, was Lua macht. Außerdem weiß ich nicht, ob das mit Lua möglich ist, aber Sie können es .NET-Objekten geben und mit ihnen in Javascript spielen (Jint steht für Javascript INTpreter). Sie können Ihre Anwendung auch mit dem Berechtigungssatz sichern. Hier ist der gleiche Code zuvor mit 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

Hallo Nicholas. Danke für die Post. Ich habe noch nicht mit inetgrating Skripten mit einer .net Sprache gearbeitet. Können Sie ein Beispiel dafür, wie ich 3D-Objekte (erstellt mit C#) mit jint manipulieren könnte? Thanx – user241949

+0

Hallo, ich sicher es dir geben kann, aber ich denke, es müßte eine lange Diskussion darüber, wie sie in Jint zur Verfügung zu stellen: Die erste Möglichkeit ist das Spiel-Objekt in Jint direkt zur Verfügung zu stellen: JintEngine Motor = new JintEngine(). SetParameter ("game", yourGameObject); Die andere Möglichkeit besteht darin, nur die Objekte zu deklarieren, die Sie benötigen. Natürlich ist dieser Weg viel weniger dynamisch. Es liegt an Ihnen und hängt auch von Ihren Bedürfnissen ab. Wenn Sie mehr darüber diskutieren möchten, erstellen Sie bitte einen Thread auf http://jint.codeplex.com/Thread/List.aspx –

+0

Nochmals vielen Dank! – user241949