
▽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++のソースで<と>が表示されていない問題に対応