ページ 11

Luaで思ったように動かない

Posted: 2014年2月11日(火) 20:02
by dic
お世話になります。dicです。

今、LuaとC/C++を組み合わせてゲームを組んでいます。
そこで、どうにもLuaから C/C++の関数が呼び出されていない状態になってしまいました。
ちょっといじるまえまでは動いていたのですが・・・・

ソースコード全部は載せきれないので、部分的にのせますので、どこかおかしいところはないでしょうか?
LuaからC/C++の関数が呼び出されないというのは、ブレークポイントをセットしていてて、
そこに、ヒットしないのです。
(GetenemyIndex関数でブレークポイントを設定しても、ここで止まらない よびだされていない)
なので、luaの記述に問題があるのでしょうか?


ステージ.cpp

コード:


//	=========================================================================
//		g_tInfo.m_enemyIndex の取得
int		GetenemyIndex()
{
	return g_tInfo.m_enemyIndex;
}

int		GetenemyIndexGlue( lua_State *L )
{
	//	目的の関数を実行
	int		enemyIndex = GetenemyIndex();
	//	スタックをクリア
	lua_settop( L, 0 );
	//	返り値を格納
	lua_pushnumber( L, enemyIndex );
	//	返り値の数1
	return 1;
}




//	=========================================================================
void	Cステージ::メインステージ()
{
	DrawFormatString( 0, 60, GetColor(0,0,0), "enemyIndex:%d", g_tInfo.m_enemyIndex );
	DrawFormatString( 0, 80, GetColor(0,0,0), "m_frame:%d", m_frame );

	static	int		stage_mode = 0;

	if( 0 == stage_mode )
	{
		//	敵リストを読み込む
		char	szLua[80];
		sprintf_s( szLua, "stage%02d.lua", g_tInfo.m_stage_count);

		FILE	*file;
		fopen_s( &file, szLua, "rt" );
		if( file )
		{
			luaL_dofile( L, szLua );
			fclose( file );
			stage_mode = 1;
			m_frame = 0;
			//	もし敵リストが有効で、敵が追加されたら
			if( g_tInfo.mv_Enemy.size() > 0 )
			{
				g_tInfo.m_enemyIndex++;
			}
		}
		else
			DrawFormatString( 100, 0, GetColor(0,0,0), "%s がありません", szLua );
	}
	else
	{
		//	通常の処理
		プレイヤーの処理();
		プレイヤーの弾の処理();
		敵リストの処理();
		敵の処理();
		敵の弾の処理();
		あたり判定処理();

		if( 0 == g_tInfo.mv_Enemy.size() )
			stage_mode = 0;
	}
}



main.cpp

コード:


	//	LuaのVMを作成する
	L = lua_open();
	//	Luaの標準ライブラリを開く
	luaL_openlibs( L );
	//	C関数を登録
	lua_register( L, "L_DrawString", L_DrawStringGlue );
	lua_register( L, "L_DrawString2", L_DrawString2Glue );
	lua_register( L, "L_SelectIndex", L_SelectIndexGlue );
	lua_register( L, "L_ChangeState", L_ChangeStateGlue );
	lua_register( L, "L_DrawStringEnd", L_DrawStringEndGlue );
	lua_register( L, "EnemyCreate",		EnemyCreateGlue );
	lua_register( L, "EnemySet",		EnemySetGlue );
	lua_register( L, "SetenemyIndex",	SetenemyIndexGlue );
	lua_register( L, "GetenemyIndex",	GetenemyIndexGlue );


stage01.lua

コード:

--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
function	EnemyScript01()
	--   Create( frame,   x,   y, kind,   v,   a, angle, shoot );
	EnemyCreate(   -1,   0,   0,    1,   2,   0,     0,     1 );
	--   Set( start, end,   v,   a, angle, shoot );
	EnemySet(     0, 200,   4, -0.1,    45,     0 );
	EnemySet(     0, 700,   1,    0,     0,     1 );
	EnemySet(     0, 900,   4, 0.01,   -45,     0 );


	--   Create( frame,   x,   y, kind,   v,   a, angle, shoot );
	EnemyCreate(  300,  100,   0,    1,   2,   0,     0,     1 );
	--   Set( start, end,   v,   a, angle, shoot );
	EnemySet(     0, 200,   4, -0.1,    45,     0 );
	EnemySet(     0, 700,   1,    0,     0,     1 );
	EnemySet(     0, 900,   4, 0.01,   -45,     0 );
end
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------






--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
function	EnemyScript02()
	--   Create( frame,   x,   y, kind,   v,   a, angle, shoot );
	EnemyCreate(   -1,   0,   0,    1,   2,   0,     0,     1 );
	--   Set( start, end,   v,   a, angle, shoot );
	EnemySet(     0, 200,   4, -0.1,    45,     0 );
	EnemySet(     0, 700,   1,    0,     0,     1 );
	EnemySet(     0, 900,   4, 0.01,   -45,     0 );


	--   Create( frame,   x,   y, kind,   v,   a, angle, shoot );
	EnemyCreate(  300,  100,   0,    1,   2,   0,     0,     1 );
	--   Set( start, end,   v,   a, angle, shoot );
	EnemySet(     0, 200,   4, -0.1,    45,     0 );
	EnemySet(     0, 700,   1,    0,     0,     1 );
	EnemySet(     0, 900,   4, 0.01,   -45,     0 );
end
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------







--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
function	EnemyScriptEnd
	L_DrawString( 100, 0, "EnemyScriptの最後です", 1, 0 );
end
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------






functionTable = {}

functionTable[1] = EnemyScript01;
functionTable[2] = EnemyScript02;
functionTable[3] = EnemyScriptEnd;


function	CreateEnemy( index )
end


index = GetenemyIndex();

functionTable[index]();

--CreateEnemy( index );

Re: Luaで思ったように動かない

Posted: 2014年2月11日(火) 20:48
by みけCAT
ファイルを開いたあと、閉じる前にそのファイルに対してluaL_dofileを呼び出しているので、
ファイルの排他制御によりluaL_dofileでスクリプトを読み込めず、実行できないのではないでしようか?

Re: Luaで思ったように動かない

Posted: 2014年2月11日(火) 20:58
by みけCAT
自分でスクリプトファイルが存在するか確認せずにいきなりluaL_dofileを呼び出し、そこでエラーチェックをするべきだと思います。
スクリプトファイルが存在しない場合も、きちんとそのようなメッセージが取得できるはずですし、
Luaを書き間違えた場合も文法のエラーがあれば教えてくれるはずです。

Re: Luaで思ったように動かない

Posted: 2014年2月11日(火) 21:09
by dic
>>みけCATさん
回答ありがとうございます。

自分で調べたところ、どうやら自前のL_DrawString()関数がないと
うまく動くようなので、もう一度調べます。

コード:


 
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
function    EnemyScriptEnd
    L_DrawString( 100, 0, "EnemyScriptの最後です", 1, 0 );
end
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--------------------------------------------------------------------------
 
 
ここをコメントアウトすると、うまく動くのです。

Re: Luaで思ったように動かない

Posted: 2014年2月11日(火) 21:20
by dic
わかりました!

コード:

function    EnemyScriptEnd
    L_DrawString( 100, 0, "EnemyScriptの最後です", 1, 0 );
end
ここで () カッコをつけわすれてました

コード:

function    EnemyScriptEnd()
    L_DrawString( 100, 0, "EnemyScriptの最後です", 1, 0 );
end
にしたら、うまく動きました。
解決しました。
ありがとうございました。

Re: Luaで思ったように動かない

Posted: 2014年2月12日(水) 09:31
by ookami
luaL_dofileの時、Luaスクリプト内でのエラーを取得するとよいと思います。
http://hyakuren-soft.sakura.ne.jp/games ... _page.html
これ含めて解決済みでしたらすいません><

Re: Luaで思ったように動かない

Posted: 2014年2月13日(木) 08:00
by dic
>>ookamiさん
Luaのエラーを出力させる方法を探していました。
さっそく参考にさせていただきました。
ありがとうございました。