ページ 11

luaで、数値を加算できるような方法

Posted: 2014年7月09日(水) 02:04
by dic
今回は、どうしてもロジックがわからないので質問させてください。

C/C++ と lua で組もうとしています。
そこで、C/C++ で線を引き、毎フレームごとに座標を加算していく
ということをluaのファイルでおこないたいのです。

今の方法だと、毎フレーム lua スクリプトを呼び出し、そのつどluaで
使用する変数を初期化しています。
なので、毎回luaで使用する変数は初期値だけが適応されてしまいます。

ではなくて、2フレームにluaスクリプトを呼び出したら、1フレーム時の座標から
すこしずれて(加算されて)処理したいのです。


伝えづらいのでソースコードを貼ります。

--- C/C++ ---

コード:

// DxLib_骨組み.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "DxLib_骨組み.h"

lua_State	*L;

void	DrawLine( int x1, int y1, int x2, int y2, int r, int g, int b )
{
	DrawLine( x1, y1, x2, y2, GetColor(r,g,b) );
}

int		DrawLineGlue( lua_State *L )
{
	//	引数を取得
	int	x1 = (int)lua_tonumber( L, 1 );
	int	y1 = (int)lua_tonumber( L, 2 );
	int	x2 = (int)lua_tonumber( L, 3 );
	int	y2 = (int)lua_tonumber( L, 4 );
	int	r = (int)lua_tonumber( L, 5 );
	int	g = (int)lua_tonumber( L, 6 );
	int	b = (int)lua_tonumber( L, 7 );
	int	color = GetColor(r,g,b);

	//	目的の関数を実行
	DrawLine( x1, y1, x2, y2, color );

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

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

template <typename T1, typename T2, typename T3, typename T4> void DrawLine( T1 t1, T2 t2, T3 t3,T4 t4, int color )
{
	DrawLine( (int)t1, (int)t2, (int)t3, (int)t4, color );
}



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

	luaL_dofile( L, "start.lua" );

	//	関数を登録
	lua_register( L, "DrawLine", DrawLineGlue );

	//	ウィンドウモードで起動
	ChangeWindowMode( TRUE );

	DxLib_Init();

	// Zキーの入力待ち
	while( CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		ClearDrawScreen();

		if( luaL_dofile( L, "start.lua" ) )
		{
			//	エラー時のメッセージ表示
			string error_message = lua_tostring( L, -1 );
			DrawString( 0, 0, error_message.c_str(), GetColor(255,0,0) );
		}

		//	やりたいこと
		static	double x1 = 100, y1 = 100, x2 = 300, y2 = 200;
		DrawLine( x1, y1, x2, y2, GetColor(128,128,0) );
		x1 += 0.1; y1 += 0.1; x2 += 0.1; y2 += 0.1;

		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			 break ;	// エラーが発生したらループを抜ける
		}
	}
	DxLib_End();

	lua_close( L );
}
--- start.lua ---

コード:

x1 = 100;
y1 = 100;
x2 = 300;
y2 = 200;
r = 128;
g = 255;
b = 255;


function	DrawLine_test( x1, y1, x2, y2, r, g, b )
	DrawLine( x1, y1, x2, y2, r, g, b );
	return x1+1, y1+1, x2+1, y2+1;
end

x1, y1, x2, y2 = DrawLine_test( x1, y1, x2, y2, r, g, b );


となっています。
問題のluaファイルは、呼び出すごとに初期値が入りますので、
どうやって更新しても、初期値で処理されてしまいます。

2フレーム以降、上のluaスクリプトでは、x1 = 100 が x1 = 100.5 , 101 , 101.5 , 102 ,,,,
となっていってほしいのですが、どのような方法があるのでしょうか?
それとも、このやり方(毎フレームごとにluaスクリプトを呼び出す方法)では
無理なのでしょうか?

詳しい方いらっしゃいましたら、教えていただけると幸いです。

Re: luaで、数値を加算できるような方法

Posted: 2014年7月09日(水) 09:39
by ookami
以下のいずれかでどうでしょうか。

案1
【Lua側】
初期化部分でフラグ処理する。

コード:

if not init then
    init=true
    x1 = 100;
    :
    b = 255;
end
:
【C側】修正なし

案2
【Lua側】
それぞれ関数化する。

コード:

function init()
    x1 = 100;
    y1 = 100;
    x2 = 300;
    y2 = 200;
    r = 128;
    g = 255;
    b = 255;
end

function DrawLine_test( x1, y1, x2, y2, r, g, b )
    DrawLine( x1, y1, x2, y2, r, g, b );
    return x1+1, y1+1, x2+1, y2+1;
end

function exec()
    x1, y1, x2, y2 = DrawLine_test( x1, y1, x2, y2, r, g, b );
end
【C側】

コード:

:
luaL_dofile( L, "start.lua" );

// init関数呼び出し
lua_getglobal(L, "init");
lua_pcall(L, 0, 0, 0);
:
while( CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
    ClearDrawScreen();
    :
    ※※※ start.luaを開くのではなく ※※※
    // exec関数呼び出し
    lua_getglobal(L, "exec");
    lua_pcall(L, 0, 0, 0);
    :
}
:
②ですと、ループごとにstart.luaファイルをオープンしなくなるので軽量化が期待できるかと思います。

Re: luaで、数値を加算できるような方法

Posted: 2014年7月09日(水) 09:59
by softya(ソフト屋)
追加のアイデアとしてコルーチンで実装するという手もありますね。
「その3 コルーチンで状態遷移をLuaで制御」
http://marupeke296.com/LUA_No3_Coroutine.html

Re: luaで、数値を加算できるような方法

Posted: 2014年7月09日(水) 21:18
by dic
>>ookamiさん
示してくれた例をもとに、うまく期待した動作が実装できました。


>>softya(ソフト屋) さん
時間ができしだい、コルーチンについても勉強します。


解決しました。ありがとうございました。