Использование нескольких ScriptEngines

У меня есть папка, которая может содержать произвольное количество скриптов, которые функционируют как заклинания. Код в этих файлах сценариев является минимальным для большинства из них.

Простое заклинание может содержать:

  • Вернуть имя
  • Возврат урона
  • Эффект отображения
  • Запуск / контроль снаряда

Более продвинутые могут изменить местность или что-то в этом роде.

Spell класс на Java сторона вызывает функцию приведения в сценарии.

Что я хотел бы знать, так это различные способы сделать это и их плюсы и минусы. Я вижу это прямо сейчас: создайте новый ScriptEngine объект, когда заклинание прочитано, уничтожить его, когда оно сделано.

Я не думаю, что можно установить новый ScriptContext на существующий ScriptEngine потому что заклинание, возможно, еще не закончило разыгрывать, до того, как разыгрывается следующее заклинание, если я не реализую какую-либо систему очередей.

1 ответ

Решение

Вместо того, чтобы каждый раз создавать новый скрипт-движок, поддерживайте единый ScriptEngine экземпляр и просто создайте новый контекст (с новыми глобальными переменными) каждый раз. Затем оцените ваш сценарий в этом контексте:

ScriptContext context = new SimpleScriptContext();
context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);

engine.eval(script, context);

Если ваши сценарии не имеют дело с изменяемым состоянием в глобальной области (глобальная область JavaScript), то вы можете просто создать новый контекст и использовать те же глобальные переменные движка:

ScriptContext engineContext = engine.getContext()

ScriptContext context = new SimpleScriptContext();
context.setBindings(
    engineContext.getBindings(ScriptContext.ENGINE_SCOPE),
    ScriptContext.ENGINE_SCOPE
);

engine.eval(myScript, myContext);
Другие вопросы по тегам