吉特+;XNA(C#)

吉特+;XNA(C#),c#,xna,jint,C#,Xna,Jint,是否可以使用来操纵使用XNA(C#)创建的三维环境,并向该环境添加功能(再次使用jint) 看看,考虑如何为.Net选择脚本平台 通常,请确保可以在XNA应用程序中构建脚本引擎。使用脚本引擎并在应用程序中提供挂钩与通过公共接口调用外部程序集没有太大区别 Jint是一个选项,LUA是一个选项签出 LUA是一种非常有趣且易于使用的语言,它很好地支持协作多任务处理(coroutines)。它的基本数据类型是一个非常灵活和强大的表(字典和数组的交叉点) 这是我刚刚写的东西,只是为了测试一下。我正在为名为

是否可以使用来操纵使用XNA(C#)创建的三维环境,并向该环境添加功能(再次使用jint)

看看,考虑如何为.Net选择脚本平台


通常,请确保可以在XNA应用程序中构建脚本引擎。使用脚本引擎并在应用程序中提供挂钩与通过公共接口调用外部程序集没有太大区别

Jint是一个选项,LUA是一个选项签出

LUA是一种非常有趣且易于使用的语言,它很好地支持协作多任务处理(coroutines)。它的基本数据类型是一个非常灵活和强大的表(字典和数组的交叉点)

这是我刚刚写的东西,只是为了测试一下。我正在为名为
GTest
的脚本注册一个函数,该函数映射到名为
LUA\u GTest
的对象中的一个C方法。该方法接受一个通用对象,在脚本中,我将向它传递一个表,其中包含一个表,该表包含一个表示double的字符串。在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;
    }
}

作为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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
程序p=新程序();
p、 Run();
}
私家车
{
JintEngine发动机=新的JintEngine();
engine.SetFunction(“GTest”,新Jint.delegations.Func(luagtest));
引擎运行(“GTest([[3,3']])”;
}
专用双LUA_GTest(对象d)
{
WriteLine(“Got{0}-{1}”,d.GetType().ToString(),d.ToString());
而(d是ArrayList)
{
d=((ArrayList)d)[0];
WriteLine(“Got{0}-{1}”,d.GetType().ToString(),d.ToString());
}
if(d是字符串)
{
d=double.Parse((字符串)d);
WriteLine(“Got{0}-{1}”,d.GetType().ToString(),d.ToString());
}
如果(d是双精度)
返回(双)d*2;
返回0;
}
}

一个重要的问题是:您希望您的应用程序能够在xbox上运行吗?如果是这样的话,你的选择就少了很多。我只关心它在电脑上运行。嗨,尼古拉斯。谢谢你的来信。实际上,我以前从未使用.net语言使用过inetgrating脚本。你能给我举个例子,说明如何使用jint操作3d对象(用c#创建)吗?thanxHi,我当然可以给你,但我认为关于如何在Jint中提供它们需要长时间的讨论:第一种可能是直接在Jint中提供游戏对象:JintEngine engine=new JintEngine().SetParameter(“游戏”,你的游戏对象);另一种可能是只声明所需的对象。当然,这种方式的动态性要小得多。这取决于你,也取决于你的需要。如果你想更多地讨论它,请在Nice上创建一个线程-Lua需要更多的.net解决方案。