fslasht (3370) の日記

2004 年 05 月 06 日
午後 11:56

[lua] Lua操作クラスが出来てきた

STATUS: 故障中

● FTEzLua利用サンプルイメージ
/*
 開発中の Lua 操作クラス「FTEzLua」の使用例
 けっこうMFCべったり
*/

#include "stdafx.h"
#include "FTEzLua.h"

class MyClass {
public:
    // テスト用関数
    void Start() {
        FTEzLua    lua;    // Luaクラスインスタンス

        lua.Open();        // Open (lua_open();と同等)
        ASSERT( lua.IsValid() );
        lua.LoadScriptFile("test.lua");        // スクリプトファイルをロード
        lua.LibOpen( FTEzLuaValue::LIB_BASE | FTEzLuaValue::LIB_MATH );    // 使用ライブラリを指定してOpen
        lua.SetThis( this );    // thisポインタをセット (コールバック関数で取得するため)

        lua.RegistFunc( "MyFunc" , MyFunc );    // コールバック関数登録

        // スクリプト中の関数(LuaFuncを呼び出し。戻り値は FTEzLuaValue(複数値保持可能)に)
        FTEzLuaValue lv = lua.CallFunc( "LuaFunc",2,2, FTEzLuaValue(123),FTEzLuaValue("ABC") );
        TRACE("Result1=%d / Reault2=%s\n",(int)lv[0],(LPCSTR)lv[1] ):

        // 新しいスレッドを生成( co_func関数を開始する )
        FTEzLua lua2 = lua.NewThread("co_func");

        FTEzLuaValue lv2;
        while ( (lv2=lua2.Resume(1, FTEzLuaValue(123))).IsValid() ) {    // スレッドを実行
            // 実行結果が有効だった場合はスレッド継続
            TRACE("Result1=%dx\n",(int)lv2 ):
        }

        lua2.Close();  // クローズ
        lua1.Close();
    }

    // コールバック関数
    static void MyFunc( lua_State *L ) {
        FTEzLua lua( L );    // Attach
        MyClass* p = lua.GetThis();        // Thisポインタを取得
        int x = lua.GetParam(1);        // 関数パラメータ1取得 (lua_tonumber( L, 1 );と同等)
        int y = lua.GetParam(2);        // 関数パラメータ2取得 (lua_tonumber( L, 2 );と同等)

        int r = p->Calc(x,y);            // thisポインタを利用して非staticメンバ関数をコール

        lua.AddParam( FTEzLuaValue(r) );                // 戻り値を設定 ( lua_pushnumber( L , r );と同等 )
    }

    // 非staticメンバ関数
    int Calc( int x,int y) {
        return x * y;
    }
}

● FTEzLuaValue利用サンプルイメージ
/*
 「FTEzLua」で使用する値管理クラス「FTEzLuaValue」の使用例
 関数の戻り値が複数になることに対応するため、Array的な使い方ができる。
*/

    FTEzLuaValue lv(128);
    FTEzLuaValue lv2("ABC");
    FTEzLuaValue lv3(lv2);

    double d = lv;
    CString str = lv2;
    int n = lv2;
    TRACE("d=%f n=%d str=%s\n",d,n,str); // 出力:d=128.000000 n=0 str=ABC

    TRACE("lv3=%d\n",(int)lv3);    // 出力:lv3=0
    TRACE("lv3=%s\n",(LPCSTR)lv3); // 出力:lv3=ABC

    lv3.Add(  FTEzLuaValue("ADDED") );
    lv3.Add(  FTEzLuaValue(9876)  );
    lv3.Add(  FTEzLuaValue("LAST")  );
    lv3.Dump();  // 出力:0:ABC 1:ADDED 2:9876.000000 3:LAST

    lv3[2]=4567;
    lv3.Dump();  // 出力:0:ABC 1:ADDED 2:4567.000000 3:LAST

    TRACE("lv3[2]=%d lv3.count=%d\n",(int)lv3[2] , lv3.Count() ); // 出力:lv3[2]=4567 lv3.count=4

    FTEzLuaValue lv4;
    lv4=lv3;
    lv4.Dump(); // 出力:0:ABC 1:ADDED 2:4567.000000 3:LAST

    FTEzLuaValue lv5 = FTEzLuaValue( "dsfdvs",0,  123,"ZZZ",1.01,999,lv4,"END");    // 複数の値で初期化 引数(フォーマット,ダミー, 値1,値2 ... )、フォーマット(d=int f=double s=LPCSTR v=FTEzLuaValue)
    lv5.Dump(); // 出力:1:123.000000 2:ZZZ 3:1.010000 4:999.000000 5:ABC 6:ADDED 7:4567.000000 8:LAST 9:END
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

物事のやり方は一つではない -- Perlな人

処理中...