すべてを処理する main_window クラスがあります。ここで重要なのは、敵のベクトルです。敵が死んだとき、エフェクト オブジェクトをエフェクトのベクトルに押し戻します。ここが便利なポイントです
lua_State *G = luaL_newstate(); // I need this thing to be global
// class constructor
Effect::Effect(int ix, int iy)
{
// not important codes deleted
luaL_openlibs(G);
luaL_dofile(G, "script/effect/blue_explosion.lua");
lua_getglobal(G, "draw_x");
draw_x = lua_tointeger(G, -1);
lua_getglobal(G, "draw_y");
draw_y = lua_tointeger(G, -1);
/* the function name */
lua_getfield(G, LUA_GLOBALSINDEX, "setup");
/* the first argument */
lua_pushnumber(G, ix);
/* the second argument */
lua_pushnumber(G, iy);
/* call the function with 2 arguments, return 1 result */
lua_call(G, 2, 0);
}
これらのこと自体はうまくいっていますが、ここで問題が発生します
void Effect::close_lua()
{
lua_close(G);
}
これは、このクロージャなしでエフェクトの有効期限が切れたときに呼び出され、Ram を使い果たし始めますが、これを使用し、ロットの Effect オブジェクトが作成された場合、物は
アクセス違反 (セグメンテーション違反)でクラッシュします。
これを修正する方法を知っている人はいますか?
または、スクリプト言語を変更する必要がありますか?
1 つの状態を 2 回閉じたようですが、lua_close(G) は同じベクトルにある別のオブジェクトにあります。