2010-01-01 36 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