
▽Squirrelを組み込む▽
「VisualC++2008EEでSquirrelが使えるようにする方法」で作成した
DLLファイルを使って、プログラムにSquirrelを組み込んでみます。
今回のプログラムではスクリプトからC++側の関数を実行しています。
(C++側でbmpのロードなど管理を行うイメージです)
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.ソースファイルを記述する
9.スクリプトファイルを作成する
実行ファイルが作成されるフォルダ(DebugフォルダまたはReleaseフォルダ)に
スクリプトファイルを作成します。
1.メモ帳を開く。
2.文字コードを「ANSI」にしてtest.nutとして保存する。
(他のテキストエディタの場合はSJISで作成)
10.スクリプトファイル(test.nut)を記述する
VisualStudioでF5を押してプログラムをビルド、実行します。
コマンドプロンプトが開き、下記のとおり表示されれば成功です。
DLLファイルを使って、プログラムにSquirrelを組み込んでみます。
今回のプログラムではスクリプトからC++側の関数を実行しています。
(C++側でbmpのロードなど管理を行うイメージです)
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>
//Resource
class Resource
{
public:
Resource(){
//リソース初期化
strncpy(filename,"",257);
}
~Resource(){
//リソース解放
}
bool load(const char* fileName){
strncpy(filename,fileName,257);
return true;
}
const char* getFileName(){
return filename;
}
private:
char filename[257];
};
//デバッグ用メソッド
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);
//Squirrelで使用するC++クラスを登録
SqPlus::SQClassDef<Resource>(_T("Resource"))
.func( &Resource::load, _T("load"))
.func( &Resource::getFileName, _T("getFileName"));
try{
//Squirrelスクリプトを記述したファイルを読み込んでコンパイル
SquirrelObject sqObj = SquirrelVM::CompileScript(_T("test.nut"));
//Squirrelスクリプトの実行
SquirrelVM::RunScript(sqObj);
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)を記述する
local resourceA = Resource();
local resourceB = Resource();
//ファイル名を設定する。(ロードのダミー処理を行う)
resourceA.load("a.bmp");
resourceB.load("b.bmp");
//ファイル名を取得する。
print("リソースAは" + resourceA.getFileName()+"です\n");
print("リソースBは" + resourceB.getFileName()+"です\n");
11.プログラムを実行するVisualStudioでF5を押してプログラムをビルド、実行します。
コマンドプロンプトが開き、下記のとおり表示されれば成功です。
リソースAはa.bmpです リソースBはb.bmpです
▽参考にしたサイト様▽
▽改変履歴▽
2010/08/29
・ブログ「日曜ゲームクリエータの日記」から転記
2010/09/02
・C++のソースで<と>が表示されていない問題に対応
・ブログ「日曜ゲームクリエータの日記」から転記
2010/09/02
・C++のソースで<と>が表示されていない問題に対応