Jint + XNA (C#)

6

是否有可能使用jint来操作用XNA (C#)创建的3D环境,并且使用jint为该环境添加功能?


一个重要的问题是:你想让你的应用程序能在Xbox上运行吗?如果是,那么你的选择就会大大减少。 - Martin
不是真的。我只关心它在电脑上运行。 - user241949
3个回答

4
作为Jint的贡献者,我建议您使用Jint。Jint比Lua更简单。此外,我不知道Lua是否可以实现这一点,但您可以将.NET对象传递给它并在JavaScript中使用它们(Jint代表JavaScript解释器)。您还可以使用权限集来保护应用程序。以下是使用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;
    }
}

嗨,尼古拉斯。感谢您的帖子。我以前没有使用过将脚本与.NET语言集成的经验。您能给我一个示例,说明如何使用Jint操作使用C#创建的3D对象吗?谢谢。 - user241949
嗨,我肯定可以给你,但我认为需要长时间讨论如何在Jint中使它们可用:第一种可能性是直接在Jint中使游戏对象可用:JintEngine engine=new JintEngine().SetParameter("game",yourGameObject);另一种可能性是仅声明您需要的对象。当然,这种方式要不太动态。这取决于您,也取决于您的需求。如果您想进一步讨论,请在http://jint.codeplex.com/Thread/List.aspx上创建一个线程。 - Nicolas Penin

2
Jint是一种选择,LUA也是一种选择,请查看LuaForge
LUA是一种非常有趣且易于使用的语言,具有良好的协作多任务支持(协同程序)。它的基本数据类型是表格(类似于字典和数组的交叉),非常灵活和强大。
这里是我刚刚写的一个测试内容。我正在为脚本注册一个名为GTest的函数,该函数映射到我的对象中的一个C#方法LUA_GTest。该方法接受一个通用对象,在脚本中,我将传递给它一个包含表示双精度浮点数的字符串的表格。在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;
    }
}

很好 - Lua需要更多的曝光来解决.NET方案。 - David Robbins

1

看一下这个SO问题, 考虑如何选择 .Net 的脚本平台。

通常情况下,您可以在 XNA 应用程序中构建一个脚本引擎。使用脚本引擎并提供钩子到应用程序与通过公共接口调用外部组件没有太大的区别.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接