【发布时间】:2010-12-31 14:52:00
【问题描述】:
是否可以使用jint 来操作使用 XNA (C#) 创建的 3D 环境,并向该环境添加功能(再次使用 jint)?
【问题讨论】:
-
一个重要的问题是:您希望您的应用能够在 xbox 上运行吗?如果是这样,您的选择会减少很多
-
并非如此。我只关心它在 PC 上运行。
是否可以使用jint 来操作使用 XNA (C#) 创建的 3D 环境,并向该环境添加功能(再次使用 jint)?
【问题讨论】:
作为 Jint 的贡献者,我会推荐你 Jint。 Jint 使它比 Lua 所做的更简单。此外,我不知道 Lua 是否可以做到这一点,但你可以给它 .NET 对象并在 javascript 中使用它们(Jint 代表 Javascript INTpreter)。您还可以使用权限集保护您的应用程序。这是之前使用 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;
}
}
【讨论】:
Jint 是一个选项,LUA 是一个选项查看LuaForge
LUA 是一种非常有趣且易于使用的语言,对协作多任务(协程)提供了很好的支持。它的基本数据类型是一个非常灵活和强大的表格(它是字典和数组的交叉)。
这是我刚才写的东西,只是为了测试它。我正在为名为@987654322@ 的脚本注册一个函数,该函数映射到我的对象中名为LUA_GTest 的C# 方法。该方法接受一个通用对象,并且在脚本中我将一个表传递给它,该表包含一个表,该表包含一个表示双精度的字符串。在 C# 中,我展开所有内容并根据双精度值返回一个值。
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;
}
}
【讨论】:
看看this SO question,考虑如何为 .Net 选择脚本平台。
一般来说,您可以在 XNA 应用程序中构建脚本引擎。使用脚本引擎并在应用程序中提供挂钩与通过公共接口调用外部程序集没有太大区别。
【讨论】: