[Lua] グルー関数が呼び出されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

[Lua] グルー関数が呼び出されない

#1

投稿記事 by dic » 11年前

Luaにて、グルー関数が呼び出されなくなってしまいました。

特に変わった処理はしていないと思うのですが、なぜかグルー関数が
呼び出されなくなりました。
本の通りにやっていたのですが、どこかまずい箇所でもあるのでしょうか?
グルー関数先にブレークポイントを設定しているのですが、
そのブレークポイントにヒットせず、処理が流れてしまいます。
ソースコードを載せたいと思います。
どこが間違っているのでしょうか?

[Lua側]

コード:

--	作った命令
--		L_LoadGraph( char *string );
--		L_DrawGraph( int x, int y, int handle, int transflag );
--		L_ChangeWindowMode( int windowmode );
--		L_DxLib_Init();
--		L_SetTransColor( int r, int g, int b );
--		L_DrawString( int x,int y, char *message, int r, int g, int b );
--		L_GetHitKeyState( int keycode );
--		L_DrawBox( int x1, int y1, int x2, int y2, int r, int g, int b, int FillFlag );
--		L_LoadSoundMem( char *filename );
--		L_PlaySoundMem( int handle, int PlayType, int position );
--
--

DX_PLAYTYPE_NORMAL	=	0
DX_PLAYTYPE_BACK	=	0x0001
DX_PLAYTYPE_LOOP	=	0x0002
DX_TOPPOSITIONFLAG	=	1


function init()
    x1 = 100;
    y1 = 100;
    x2 = 200;
    y2 = 200;
    r = 128;
    g = 255;
    b = 255;
	L_ChangeWindowMode( 1 );
	L_DxLib_Init();
	L_SetTransColor( 0, 255, 0 );
	player = {}
	player.x = 440;
	player.y = 240;
	player.add_x = 3;
	player.add_y = 3;
	player.image = L_LoadGraph( "image\\ハエ.bmp" );
	player.sound1 = L_LoadSoundMem( "sound\\win.wav" );
	player.angle = 0;
	player.cur = 0;
	player.input = {}
	for i = 1, 256 do
		player.input[i] = 0;
	end

	func5100 = {}
	func5100.cur = 0

	info = {}
	info.mode = 5000	-- 1.タイトル 2.つづきから 4.戦術画面
						-- 5.円を描く運動
						-- 5000.戦術画面 5100.機体改造 5200.武器改造 
						-- 5300.ステータスを見る 5400.ステージ選択
						-- 5500.修理部隊のレベルアップ
						-- 5600.セーブ 5700.ロード
						-- 5800.出撃 6000.ゲームの終了
end
...
...
...

[C/C++側]

コード:


int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nCmdShow)
{
	L = lua_open();
	luaL_openlibs(L);

//	if( lua_checkstack(L, 300) == 0 ) {
//        OutputDebugString("スタックの容量が確保できませんでした\n");
//        return 1;
//    }

	//	関数を登録
	lua_register( L, "L_DrawLine",		 L_DrawLineGlue );
	lua_register( L, "L_DxLib_Init",		 L_DxLib_InitGlue );
	lua_register( L, "L_DxLib_End",		 L_DxLib_EndGlue );
	lua_register( L, "L_ChangeWindowMode", L_ChangeWindowModeGlue );
	lua_register( L, "L_LoadGraph",		 L_LoadGraphGlue );
	lua_register( L, "L_DrawGraph",		 L_DrawGraphGlue );
	lua_register( L, "L_SetTransColor",	 L_SetTransColorGlue );
	lua_register( L, "L_DrawString",		 L_DrawStringGlue );
	lua_register( L, "L_GetHitKeyState",	 L_GetHitKeyStateGlue );
	lua_register( L, "L_DrawBox",			 L_DrawBoxGlue );
	lua_register( L, "L_DrawString",		 L_DrawStringGlue );
	lua_register( L, "L_LoadSoundMem",	 L_LoadSoundMemGlue );
	lua_register( L, "L_PlaySoundMem",	 L_PlaySoundMemGlue );

	luaL_dofile( L, "start.lua" );

	//	staut.lua の init に記述
	//	ウィンドウモードで起動
//	ChangeWindowMode( TRUE );
//	DxLib_Init();
//	SetTransColor( 0, 255, 0 );

	int	result;
	//	lua  start.lua から init関数呼び出し
	lua_getglobal( L, "init" );
	result = lua_pcall( L, 0, 0, 0 );
	if( 0 != result )
		show_pcall_error( result );
	
	//	2重起動許可
	SetDoubleStartValidFlag( TRUE );

...
...
...

コード:

void	L_ChangeWindowMode( int mode )
{
	ChangeWindowMode( mode );
}

//==================================================================
int		L_ChangeWindowModeGlue( lua_State *L )
{
	//	引数を取得
	int	mode = (int)lua_tonumber( L, 1 );

	//	目的の関数を実行
	L_ChangeWindowMode( mode );

	//	戻り値を格納
	lua_pushnumber( L, 0 );

	//	戻り値の数(0)
	return 0;
}



void	L_DxLib_Init()
{
	DxLib_Init();
}

//==================================================================
int		L_DxLib_InitGlue( lua_State *L )
{
	//	引数を取得
	int	width = (int)lua_tonumber( L, 1 );
	int	height = (int)lua_tonumber( L, 2 );

	//	目的の関数を実行
	L_DxLib_Init();

	//	戻り値を格納
	lua_pushnumber( L, 0 );

	//	戻り値の数(0)
	return 0;
}


Luaのソースコードの 29~31行目でグルー関数を呼び出しているのですが
C/C++側には、制御がなぜか来ません。

環境:
Lua 5.1
Visual C++ 2010 Express
Windows7

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: [Lua] グルー関数が呼び出されない

#2

投稿記事 by dic » 11年前

自分で調べたところ以下のLuaソースコードを削除するとうまく動きました。

ここのLuaの部分にエラーがあると思うのですが、どこがいけないのでしょうか?

コード:


 ----------------------------------------------------------------------
 --
 --			戦術画面
 --
function	senjyutu()
	L_DrawString( 100, 0, "OK", 255,0,0 );
	L_DrawString( 100, 100, "戦術画面", 255,0,0 );
	L_DrawString( 100, 120, "何をしますか", 0,255,255 );
	L_DrawString( 120, 140, "機体改造", 255,255,255 );
	L_DrawString( 120, 160, "武器改造", 255,255,255 );
	L_DrawString( 120, 180, "ステータスを見る", 255,255,255 );
	L_DrawString( 120, 200, "ステージ選択", 255,255,255 );
	L_DrawString( 120, 220, "修理部隊のレベルアップ", 255,255,255 );
	L_DrawString( 120, 240, "セーブ", 255,255,255 );
	L_DrawString( 120, 260, "ロード", 255,255,255 );
	L_DrawString( 120, 280, "出撃", 255,255,255 );
	L_DrawString( 120, 300, "ゲームを終了する", 255,255,255 );

	--	キーボードの入力処理
	for i = 1, 256 do
		player.input[i] = L_GetHitKeyState( i );
	end

	if player.input[0xC8] == 1 then
		player.cur = player.cur - 1
	end
	if player.input[0xD0] == 1 then
		player.cur = player.cur + 1
	end
	--	決定キーを押した
	if player.input[0x2C] == 1 then
		if player.cur == 0 then info.mode = 5100 end -- 機体改造
		if player.cur == 1 then info.mode = 5200 end -- 武器改造
		if player.cur == 2 then info.mode = 5300 end -- ステータスを見る
		if player.cur == 3 then info.mode = 5400 end -- ステージ選択
		if player.cur == 4 then info.mode = 5500 end -- 修理部隊のレベルアップ
		if player.cur == 5 then info.mode = 5600 end -- セーブ
		if player.cur == 6 then info.mode = 5700 end -- ロード
		if player.cur == 7 then info.mode = 5800 end -- 出撃
		if player.cur == 8 then info.mode = 6000 end -- ゲームを終了する
	end
	if player.cur > 6 then player.cur = 0 end
	if player.cur < 0 then player.cur = 6 end
	L_DrawString( 100, 140 + 20*player.cur, ">", 255,255,255 );

end


 ----------------------------------------------------------------------
 --
 --			機体改造
 --
 function	kitaikaizou()

	--	選択肢一覧
	L_DrawString( 100, 100, "何をしますか?", 255,0,0 );
	L_DrawString( 120, 120, "HPを改造する", 0,0,255 );
	L_DrawString( 120, 140, "ENを改造する", 0,0,255 );
	L_DrawString( 120, 160, "装甲を改造する", 0,0,255 );
	L_DrawString( 120, 180, "機動を改造する", 0,0,255 );
	L_DrawString( 120, 200, "前の画面に戻る", 0,0,255 );

	--	キーボードの処理
	if player.input[0xC8] == 1 tten
		func5100.cur = func5100.cur - 1
	end
	if player.input[0xD0] == 1 tten
		func5100.cur = func5100.cur + 1
	end
	--	決定キーを押した
	if player.input[0x2C] == 1 then
		if player.cur == 0 then info.mode = 5100 end -- HPを改造する
		if player.cur == 1 then info.mode = 5200 end -- ENを改造する
		if player.cur == 2 then info.mode = 5300 end -- 装甲を改造する
		if player.cur == 3 then info.mode = 5400 end -- 機動を改造する
		if player.cur == 4 then info.mode = 5500 end -- 前の画面にもどる
	end

	if func5100.cur > 4 then func5100.cur = 0 end
	if func5100.cur < 0 then func5100.cur = 4 end

	L_DrawString( 100, 120 + 20*func5100.cur, ">", 0,0,0 )

end

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: [Lua] グルー関数が呼び出されない

#3

投稿記事 by dic » 11年前

わかりました。
65,68行目の then のつづりが間違っていました。

tten -> then に修正したところ、うまく動くようになりました。

解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る