【问题标题】:Jint + XNA (C#)Jint + XNA (C#)
【发布时间】:2010-12-31 14:52:00
【问题描述】:

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

【问题讨论】:

  • 一个重要的问题是:您希望您的应用能够在 xbox 上运行吗?如果是这样,您的选择会减少很多
  • 并非如此。我只关心它在 PC 上运行。

标签: c# xna jint


【解决方案1】:

作为 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;
    }
}

【讨论】:

  • 嗨,尼古拉斯。谢谢你的帖子。我以前实际上没有使用过.net 语言的 inetgrating 脚本。你能给我一个例子来说明我如何使用 jint 操作 3d 对象(用 c# 创建)吗?谢谢
  • 嗨,我当然可以给你,但我认为需要长时间讨论如何在 Jint 中使它们可用: 第一种可能性是使 Game 对象直接在 Jint 中可用: JintEngine engine=new JintEngine().SetParameter("game",yourGameObject);另一种可能性是只声明您需要的对象。当然,这种方式的动态性要小得多。这取决于您,也取决于您的需求。如果您想讨论更多相关信息,请在jint.codeplex.com/Thread/List.aspx上创建一个主题
【解决方案2】:

Jint 是一个选项,LUA 是一个选项查看LuaForge

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

这是我刚才写的东西,只是为了测试它。我正在为名为@9​​87654322@ 的脚本注册一个函数,该函数映射到我的对象中名为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;
    }
}

【讨论】:

  • 很好 - Lua 需要更多的 .net 解决方案曝光。
【解决方案3】:

看看this SO question,考虑如何为 .Net 选择脚本平台。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多