部分的に Lua スクリプトを利用する

C++ メインで実装を行い、一部の処理のみ Lua スクリプトで記述したい場合の実装例を紹介します。AI をスクリプトを動作させる場合や、ゲームの進行状況をスクリプトで行いたい場合に便利です。


概略

以下に、サンプルを示します。
このサンプルでは、Lua スクリプト中で数値をインクリメントしつつ表示しています。

partial.cpp

#include "LuaHandler.h"
#include <luabind/luabind.hpp>
#include <iostream>

using namespace qrk;
using namespace luabind;
using namespace std;


namespace
{
  void initilizeScript(void)
  {
    // Lua の読み込みと実行を行う
    LuaHandler::doFile("partial.lua");
  }


  void callScript(void)
  {
    lua_State* lua = LuaHandler::pointer();
    try {
      // Lua 関数内のコルーチンを処理する
      call_function<void>(lua, "lua_function");

    } catch (const error &e) {
      static_cast<void>(e);
      cout << "call_function: " << lua_tostring(lua, -1) << endl;
    }
  }
}


int main(int argc, char* argv[])
{
  static_cast<void>(argc);
  static_cast<void>(argv);

  initilizeScript();

  for (int i = 0; i < 3; ++i) {
    cout << "C: " << (100 + i) << endl;
    callScript();
  }

  return 0;
}


partial.lua

-- 部分的に Lua スクリプトを利用するサンプル
-- Satofumi KAMIMURA
-- $Id: partial.lua 808 2009-05-06 21:40:00Z satofumi $

require("Scheduler")


-- 初期化を行う
-- この処理は、Lua スクリプトを読み出したときに実行される
local id_ = 0


-- 関数が呼び出される毎に実行したい処理を、コルーチンで実装しておく
-- コルーチンを使っているのは、中断と再開を行わせたいため
-- 今回の実装ならば、(while を削除すれば) C++ から lua_function() を
-- 直接呼び出す実装でよい
function lua_function()
   while true do
      print("Lua: " .. id_)
      id_ = id_ + 1
      Scheduler:yield()
   end
end

local scheduler = Scheduler:new()
scheduler:insert(lua_function)


-- コルーチンを処理するように記述しておき、
-- C++ からこの関数を呼び出す
function lua_function()
   scheduler:execute()
end


実行結果

% ./partial
C: 100
Lua: 0
C: 101
Lua: 1
C: 102
Lua: 2 


簡単ですね。
Lua で呼び出す関数が状態変数を持たないならば、コルーチンを使わず、普通の関数を使った方がよいでしょう。

普通の関数を使ったサンプルとしては chat_client.cpp, chat_client.lua があります。(チャット用の送受信を C++ で作成し、GUI を Lua で作成)


コメントページ



Generated on Mon May 18 11:11:10 2009 by  doxygen 1.5.7.1