この種のエラーについては多くの投稿があり、ほとんどの人はテーブルと配列のインデックスの問題に関連していると言っています。しかし、私はテーブルをまったく使用していません。作成したライブラリ関数を呼び出そうとしているだけで、このエラーが発生します。以下は、Java から呼び出される lua スクリプトです。
String script = new String (
"function event_touch ( )"
+ " pb.open_form ('view_monster');"
+ " print ('I ran the lua script');"
+ "end");
PBLUAengine.run_script(script, "event_touch");
これにより、例外をトラップするときに次のエラーが発生します。
"function event_touch ( ) pb.open_form ('view_monster'); print ('I run the lua script');end:1 インデックスの試行 ? (nil 値)"
run_script() 関数は、次のようにスクリプトを呼び出します (私は luaj を使用しています)。
public static LuaValue run_script ( String script )
{
try
{
LuaValue chunk = s_globals.load( script );
return chunk.call();
}
catch ( Exception e)
{
Gdx.app.error ("PBLUAengine.run_script()", e.getMessage() );
}
return null;
}
ライブラリ メソッドは次のようになり、Java から呼び出されたときに同じコードが機能します。
static class open_form extends OneArgFunction
{
public LuaValue call (LuaValue formname)
{
String tmpstr = (String ) CoerceLuaToJava.coerce(formname, java.lang.String.class );
try
{
PBscreen_game.hide_subscreen(PBscreen_game.MENU_SUBS);
PBscreen_game.show_subscreen ( PBscreen_game.FORM_SUBS);
PBsubscreen_form.open_form ( new PBform_regular ( tmpstr ) );
}
catch (Exception e)
{
Gdx.app.error("PBLUAlibrary.open_form", e.getMessage());
}
return valueOf ( 0 );
}
}
基本的に、lua パラメーターを文字列に変換し、新しい from を作成して、パラメーターに文字列を渡します。
ライブラリ関数の宣言は次のようになります。
public LuaValue call( LuaValue modname, LuaValue env )
{
LuaValue library = tableOf();
library.set( "open_form", new open_form() );
library.set( "open_system_form", new open_system_form() );
env.set( "pb", library );
return library;
}
これは、システム全体で見ることができる唯一の「テーブル」である可能性があります。これは通常、適切なクラスを適切な関数名にリンクするために使用されます。
誰にもアイデアがありますか?