ページ 11

C++でLuaの使い方

Posted: 2010年1月06日(水) 21:15
by kai
はじめまして。質問させてください。

現在RPGを作っているのですが、イベントに使うスクリプトをLuaにしようと思いました。
そこで、C++にLuaを組み込むにはどうすれば良いのでしょうか。
普通に組み込むなら出来ますが、沢山スクリプトを作るとその度にC++側でスタックしてやる必要があるのですか?
イベントの概念自体もはっきりしてないのでそもそもの勘違いなのかもしれませんが、、、よろしくお願いします。

環境はVC++2008,C++,DXライブラリです。
駄文すみませんでした。

Re:C++でLuaの使い方

Posted: 2010年1月06日(水) 21:22
by sizuma
僕もやってみたいな、とは思ってるんですけどね。
本格的にやるなら↓

スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
http://www.amazon.co.jp/%E3%82%B9%E3%82 ... 4797348550

おそらくC++もLuaも使える人用でしょう。 画像

Re:C++でLuaの使い方

Posted: 2010年1月06日(水) 23:14
by kai
返信ありがとうございます。

やる気はありますが、それでも趣味の領域ですし、学生なので流石にそこまでお金は出せません;;
とりあえず明日本屋で探してみます。

Re:C++でLuaの使い方

Posted: 2010年1月07日(木) 00:10
by softya
Luaを使った事が無い事をお断りしておきます。

RPGのオーソドックスな手法としては、マップの指定区間を踏むことやNPCキャラクタと会話することでLuaの関数を呼び出せば良いと思います。
あとはマップの初期化とか、キャラクタの配置とか色々便利なので必要に応じて関数を増やせば良いかなと。
スクリプトはマップごとに作った方が管理が楽だと思います。その場合グローバル変数の持ち回り方法は考えて置く必要がありますね。
あと、Luaから会話メッセージを出す場合などに、ずっとLuaにいるままって訳にもいかないのでメッセージループに戻る方法は考えておく必要があります。Luaだとコルーチンが使えるかもしれません。

Re:C++でLuaの使い方

Posted: 2010年1月07日(木) 13:25
by Naohiro19
コンソールで動くサンプルプログラムです。
#include <stdio.h>
#include <lua.hpp>
#pragma comment(lib, "lua5.1.lib")

//add関数の実装
int add( int a, int b)
{
    return a + b;
}

//add関数のグルーコード
int addGlue(lua_State* L)
{
    //引数を取得
    int a = (int)lua_tonumber(L, 1);
    int b = (int)lua_tonumber(L, 2);

    //目的の関数を実行
    int ret = add(a, b);

    //スタックをクリア
    lua_settop(L, 0);

    //戻り値を格納
    lua_pushnumber(L, ret);
    return 1;
}

int main(void)
{
    //luaのVMを開く
    lua_State* L = lua_open();
    lua_openlibs(L);

    //関数をLuaに登録する
    lua_register(L, "add", addGlue);

    //luaの読み込み
    if( lua_loadfile(L, "add.lua") || lua_pcall(L,0,0,0)){
        printf("error: %s\n", lua_tostring(L, - 1));
        return -1;
    }

    //luaを閉じる
    lua_close(L);
    return 0;
}
Luaからは
-- add.lua
local res = add(10, 9)
local fmt = string.format("10 + 9 = %d", res)
print(fmt)
で呼び出せます。
結果は「10 + 9 = 19」と画面に表示されると思います。

Re:C++でLuaの使い方

Posted: 2010年1月07日(木) 20:40
by kai
>softyaさん
> あと、Luaから会話メッセージを出す場合などに、ずっとLuaにいるままって訳にもいかないのでメッセージループに戻る方法は考えておく必要があります。Luaだとコルーチンが使えるかもしれません。
コルーチンですか。使ったことがないですが、便利そうですね。
勉強してみます。

>Naohiro19さん
わざわざ書いていただきありがとうございます。
グルーコードを指定してやれば良かったんですか。知らなかったです。
ありがとうございましたm(__)m


出来そうな気がするので解決にします。
また質問した際にはよろしくお願いします。