▽Squirrelを組み込む2▽
VisualC++2008EEでSquirrelが使えるようにする方法」で作成した
DLLファイルを使って、プログラムにSquirrelを組み込んでみます。

今回のプログラムではC++側からスクリプトで定義した関数を実行しています。
(C++側でゲームの全体のループを管理し、各処理はスクリプトで処理するイメージです)
1~7までは前回「Squirrelを組み込む」と同じ手順です。
飛ばす場合はこちら

1.ソリューション(プロジェクト)を作成する
Win32コンソールアプリケーションを作成します。
 1.VisualC++2008EEを起動。
 2.メニューの「ファイル」-「新規作成」-「プロジェクト」を選択。
 3.「Win32 コンソール アプリケーション」を選択して新規作成を行う。
  ※アプリケーションウィザードはWindowsアプリケーションで
   「空のプロジェクト」にチェックを入れる

2.dllファイルをコピーする
前回、作成したdllファイルをコピーします。
 1.1で作成したソリューションのフォルダにlibフォルダを作成。
 2.「前回のフォルダ/lib」から以下のdllファイルをコピーする。
  ・sqplus.lib
  ・sqstdlib.lib
  ・squirrel.lib

3.libフォルダをプロジェクトに追加する
ビルド時にdllファイルが読み込まれるようにします。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「リンカ」をクリックし、「追加のライブラリディレクトリ」に「lib」を入力。
 3.OKボタンをクリックし、閉じる。

4.ヘッダーファイルをコピーする
前回、作成したプロジェクトからヘッダーファイルをコピーします。
 1.1で作成したソリューションのフォルダにincludeフォルダを作成。
 2.「前回のフォルダ/include」からすべてのヘッダーファイルをコピーする。
 3.「前回のフォルダ/sqplus」からすべてのヘッダーファイルをコピーする。

5.includeフォルダをプロジェクトに追加する
ビルド時にヘッダーファイルが読み込まれるようにします。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「C/C++」をクリックし、「追加のインクルードディレクトリ」に「include」を入力。
 3.OKボタンをクリックし、閉じる。

6.文字セットを変更する
文字セットをS-Jisに変更します。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「全般」をクリックし、「文字セット」に「マルチバイト文字セットを使用する」を選択。
 3.OKボタンをクリックし、閉じる。

7.ソースファイルを作成する
main.cppを新規作成します。
 1.ソリューションエクスプローラの「ソースファイル」を右クリック。
 2.「追加」-「新しい項目」をクリック。
 3.「C++ファイル」を選択し、ファイル名を入力、追加ボタンを押す。

8.ソースファイルを記述する
#pragma comment(lib, "squirrel.lib")
#pragma comment(lib, "sqplus.lib")
#pragma comment(lib, "sqstdlib.lib")

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>

#include <sqplus.h>

//デバッグ用メソッド
static void printFunc(HSQUIRRELVM v, const SQChar* s, ...) 
{ 
  va_list arglist; 
  va_start(arglist, s); 

  vprintf(s, arglist);

  va_end(arglist); 
}

int main()
{
  //Squirrelバーチャルマシン初期化
  SquirrelVM::Init();

  sq_setprintfunc(SquirrelVM::GetVMPtr(),::printFunc);

  try{
    //Squirrelスクリプトを記述したファイルを読み込んでコンパイル
    SquirrelObject sqObj = SquirrelVM::CompileScript(_T("test.nut"));
    //Squirrelスクリプトの実行
    SquirrelVM::RunScript(sqObj);

    //開始処理
    SqPlus::SquirrelFunction <void> (_T("onLoad"))();

    //メイン処理
    //実際には終了条件が真になるまで、ループ処理を行います。
    SqPlus::SquirrelFunction <void> (_T("onProc"))();

    //終了処理
    SqPlus::SquirrelFunction <void> (_T("onUnload"))();

    sqObj.Reset();
  }
  catch (SquirrelError & e)
  {
    // エラーがあった
    scprintf(_T("Error: %s\n"), e.desc);
  }

  // Squirrelバーチャルマシンシャットダウン
  SquirrelVM::Shutdown();

  return 0;
}

9.スクリプトファイルを作成する
実行ファイルが作成されるフォルダ(DebugフォルダまたはReleaseフォルダ)に
スクリプトファイルを作成します。
 1.メモ帳を開く。
 2.文字コードを「ANSI」にしてtest.nutとして保存する。
  (他のテキストエディタの場合はSJISで作成)

10.スクリプトファイル(test.nut)を記述する
//開始処理
function onLoad(){
  print("開始処理実行!\n");
}


//メイン処理
function onProc(){
  print("メイン処理実行!\n");
}


//終了処理
function onUnload(){
  print("終了処理実行!\n");
}
11.プログラムを実行する
VisualStudioでF5を押してプログラムをビルド、実行します。
コマンドプロンプトが開き、下記のとおり表示されれば成功です。
開始処理実行!
メイン処理実行!
終了処理実行!
▽参考にしたサイト様▽
じぇっつ どっと ねっと
「Squirrel その3  Squirrel 側の関数を呼び出す」
http://dodeka.net/~j2/wp/?p=210
▽改変履歴▽
2010/09/02
・ブログ「日曜ゲームクリエータの日記」から再編