Использование нескольких 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);