所以,我真的不知道该如何正确地表述,但我会尽力而为。
我正在编写一个游戏引擎(并不是真正的目的,我正在尝试许多方法来使某些事情能够通过编程方式进行实践)。为此,我想编写脚本。而且我知道如何从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)对这种情况更好,那么也可以。我在这个问题上完全空白。
答案 0 :(得分:1)
因此,实际上,使用内置的Java来完成此操作非常简单。
Java有一个叫做“ ScriptEngineManager”的东西。要使用它,您只需执行以下操作:
ScriptEngineManager sem = new ScriptEngineManager ();
ScriptEngine se = sem.getEngineByName ( "python" );
现在有几种方法可以运行脚本。简单调用se.eval ()
方法。您可以给它一个String或Reader,这样它将运行脚本。
现在要使其具有一些变量,只需使用se.put
方法。您需要提供这两个参数;一个字符串和一个对象。
例如:
se.put ( "entity", entity ); // with entity being defined earlier
需要记住的一点是,此脚本管理器没有内置的python支持。您需要为此创建自己的ScriptEngine或使用第三方软件。我发现jython,这似乎运作良好。如果下载独立的jar并将其放在类路径中,它将起作用。不需要任何函数调用。
现在,您可以在脚本中调用实体的任何公共成员。所有的对象,值和那些子对象都传递给脚本。
我的结束代码:
实体类
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 );
}
}
我希望我可以帮助任何人。修补所有这些非常有趣。