2010-01-01 14 views
5

Czy można używać jint do manipulowania środowiskiem 3D utworzonym za pomocą XNA (C#) i do dodania funkcjonalności do tego środowiska (ponownie za pomocą jint)?Jint + XNA (C#)

+0

Ważne pytanie: czy chcesz, aby aplikacja działała na Xboksie? jeśli tak, twój wybór jest dość spory. – Martin

+0

Niezupełnie. Dbam tylko o to, by działał na PC. – user241949

Odpowiedz

1

Spójrz na this SO question, biorąc pod uwagę, jak wybrać platformę skryptową dla .Net.

Ogólnie rzecz biorąc, możesz zbudować silnik skryptowy w swojej aplikacji XNA. Używanie silnika skryptów i dodawanie haczyków do aplikacji nie różni się zbytnio od wywoływania zewnętrznych złożeń za pośrednictwem publicznych interfejsów.

2

Jint jest opcją, LUA jest opcją sprawdzeniu LuaForge

LUA jest naprawdę zabawny i łatwy w użyciu języka, z miłą obsługą wielozadaniowości (współprogram). Jego podstawowym typem danych jest tabela (która jest krzyżówką między słownikiem a tablicą), która jest bardzo elastyczna i wydajna.

Oto coś, co napisałem właśnie teraz, aby go przetestować. Rejestruję funkcję skryptu o nazwie GTest, który odwzorowuje metodę C# w moim obiekcie o nazwie LUA_GTest. Metoda akceptuje obiekt ogólny, aw skrypcie przekazuję mu tabelę zawierającą tabelę zawierającą ciąg znaków reprezentujący podwójne. W C# rozpakowuję wszystko i zwracam wartość na podstawie podwójnej wartości.

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 potrzebuje więcej ekspozycji dla rozwiązań .net. –

3

jako współpracownika Jint, polecam Ci Jint. Jint sprawia, że ​​jest to prostsze niż to, co robi Lua. Co więcej, nie wiem, czy jest to możliwe w przypadku Lua, ale możesz nadać obiektom .NET i grać z nimi w javascript (Jint oznacza JavaScript INTpreter). Możesz także zabezpieczyć swoją aplikację za pomocą Ustawień uprawnień. Oto ten sam kod podany wcześniej w 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

Cześć Nicholas. Dzięki za post. Nie pracowałem wcześniej z inetgrowaniem skryptów z językiem .net. Czy możesz podać przykład, w jaki sposób mogę manipulować obiektami 3d (utworzone za pomocą C#) za pomocą jint? thanx – user241949

+0

Witam, Witam, Na pewno dam ci to, ale myślę, że będzie potrzebna długa dyskusja, jak je udostępnić w Jint: Pierwsza możliwość to udostępnienie obiektu gry bezpośrednio w Jint: Silnik JintEngine = nowy JintEngine(). SetParameter ("game", yourGameObject); Inną możliwością jest zadeklarowanie tylko potrzebnych obiektów. Oczywiście ten sposób jest znacznie mniej dynamiczny. To zależy od Ciebie, a także zależy od Twoich potrzeb. Jeśli chcesz porozmawiać o tym więcej, utwórz wątek na http://jint.codeplex.com/Thread/List.aspx –

+0

Jeszcze raz dziękuję! – user241949