2010-01-01 34 views
5

是否可以使用jint來操作使用XNA(C#)創建的3D環境,併爲此環境添加功能(再次使用jint)?Jint + XNA(C#)

+0

一個重要的問題是:你想讓你的應用程序能夠在Xbox上運行嗎?如果是的話,你的選擇會減少很多 – Martin 2010-01-02 02:19:54

+0

不是。我只關心它在PC上運行。 – user241949 2010-01-02 20:36:50

回答

1

看看this SO question,考慮如何爲.Net選擇一個腳本平臺。

通常,您可以在您的XNA應用程序中構建一個腳本引擎。使用腳本引擎併爲應用程序提供掛鉤與通過公共接口調用外部程序集沒有多大區別。

2

Jint是一個選項,LUA是一種選擇退房LuaForge

LUA是一個非常有趣和易於使用的語言,與合作多任務(協程)很好的支持。它的基本數據類型是一張表(這是一個字典和數組之間的交叉),它非常靈活和強大。

這是我剛剛寫的東西,只是爲了測試它。我爲名爲GTest的腳本註冊了一個函數,該函數映射到名爲LUA_GTest的對象中的C#方法。該方法接受一個普通的對象,並在腳本中傳遞給它一個表,其中包含一個表,其中包含一個表示double的字符串。在C#中,我打開所有東西並返回一個基於double值的值。

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

不錯 - Lua需要更多的.net解決方案。 – 2010-04-08 13:01:29

3

作爲貢獻者Jint,我建議你Jint。 Jint使它比Lua更簡單。此外,我不知道這是否可能與Lua,但你可以給它的.NET對象,並與他們在JavaScript中玩(Jint代表Javascript INTpreter)。您還可以使用Permissions Set來保護您的應用程序。這裏是與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

嗨尼古拉斯。感謝這篇文章。我之前並沒有真正使用.net語言編寫腳本。你可以給我一個例子,說明如何使用jint操作3d對象(用c#創建)?感謝名單 – user241949 2010-01-02 18:01:30

+0

嗨, 我一定可以給你,但我認爲這將需要對如何使他們在Jint提供長時間的討論:第一種可能是使現有的遊戲對象直接Jint: JintEngine引擎= new JintEngine()。SetParameter(「game」,yourGameObject); 另一種可能性是隻聲明你需要的對象。當然,這種方式動態性較差。這取決於你,也取決於你的需求。如果您想討論更多關於它的信息,請在http://jint.codeplex.com/Thread/List.aspx – 2010-01-03 19:37:13

+0

上創建一個主題再次感謝您! – user241949 2010-01-03 19:52:36