Jint + XNA (C#)

Действительно ли возможно использовать jint, чтобы управлять 3D средой, созданной с XNA (C#) и добавить функциональность к этой среде (снова использующий jint)?

6
задан Stewart 18 October 2011 в 08:49
поделиться

3 ответа

Jint - опция, LUA - опция, проверьте LuaForge

LUA - действительно забавный и простой в использовании язык, с хорошей поддержкой кооперативной многозадачности (coroutines). Его базовый тип данных - таблица (это пересечение словаря и массива), которая очень гибкая и мощная.

Вот кое-что, что я только что написал для тестирования. Я регистрирую функцию для скрипта под названием GTest, которая сопоставляется с методом C# в моем объекте под названием LUA_GTest. Метод принимает общий объект, а в скрипте я передаю ему таблицу, содержащую строку, представляющую собой двойник. В 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;
    }
}
2
ответ дан 17 December 2019 в 00:10
поделиться

Я бы порекомендовал 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;
    }
}
4
ответ дан 17 December 2019 в 00:10
поделиться

Взгляните на этот SO вопрос, рассматривая, как выбрать платформу для скриптинга для .Net.

В общем, конечно, вы можете встроить скриптовый движок в ваше приложение XNA. Использование скриптового движка и предоставление крючков в вашем приложении не сильно отличается от вызова внешних сборок через публичные интерфейсы.

1
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: