Интегрировать скрипты Python в Java - PullRequest
0 голосов
/ 09 октября 2018

Итак, я не знаю, как правильно сформулировать это, но я сделаю все возможное.

Я пишу игровой движок (на самом деле ни для чего, я пробую много способовполучить определенные вещи, работающие на практике со способами программирования).И для этого я хочу сценарии.И я знаю, как добавлять скрипты из Java, но я видел игровые движки, которые используют несколько языков.

Итак, я хочу добавить скрипты Python, которые запускаются из процесса Java и могут взаимодействовать с объектом Java..

Как этот Java-объект, который имеет некоторые параметры (просто пример)

public class Entity {

    Script script = new Script ( "example.py" );

    loc_x = 0;
    loc_y = 0;
    loc_z = 0;

    public void update () {
        script.run ();
    }
}

С таким скриптом python

loc_x += 1
loc_z = loc_x

или

entity.loc_x += 1
entity.loc_z = entity.loc_x

У меня просто нет способа, как это реализовать.Если этот вопрос уже задавался, пожалуйста, покажите мне.If Runtime.getRuntime ().exec ( "example.py" ); - мой лучший шанс для этого, чем все в порядке.В этом случае я просто хочу знать, как поделиться этими параметрами.

Кроме того, если другой язык (например, LUA) лучше для чего-то подобного, то это тоже хорошо.Я просто абсолютно пуст в этом вопросе.

1 Ответ

0 голосов
/ 11 октября 2018

Так что на самом деле это довольно просто сделать с Java, встроенным из коробки.

В Java есть такая вещь, которая называется 'ScriptEngineManager'.Чтобы использовать его, вы просто делаете следующее:

ScriptEngineManager sem = new ScriptEngineManager ();
ScriptEngine se = sem.getEngineByName ( "python" );

Теперь есть несколько способов запуска скрипта.Просто вызовите метод se.eval ().Вы можете указать это либо String, либо Reader, и таким образом он будет запускать скрипт.

Теперь, чтобы у него были некоторые переменные, просто используйте метод se.put.Вам нужно дать это два параметра;a String and a Object.

Например:

se.put ( "entity", entity ); // with entity being defined earlier

Важно помнить, что этот менеджер сценариев не имеет встроенной поддержки Python.Для этого вам нужно либо создать собственный ScriptEngine, либо использовать стороннее программное обеспечение.Я нашел jython , и это, кажется, работает хорошо.Если вы скачаете автономную банку и поместите ее в свой путь к классам, это сработает.Нет необходимости в вызове какой-либо функции.

Теперь в скрипте вы можете вызывать любого открытого члена сущности.Все объекты, значения и эти подобъекты передаются в сценарий.

Мой конечный код:

Класс сущности

public class Entity {

    String source =
            "entity.loc_x += 1\n" +
            "entity.loc_z = entity.loc_x";
    ScriptEngine se;

    loc_x = 0;
    loc_y = 0;
    loc_z = 0;

    public Entity () {
        ScriptEngineManager sem = new ScriptEngineManager ();
        se = sem.getEngineByName ( "python" );
        se.put ( "entity", this );
    }

    public void update () {
        se.eval ( source );
    }
}

Надеюсь, я кому-нибудь помог с этим.Было довольно весело возиться со всем этим.

...