EffekseerをVisual Studio 2008、DXライブラリ製のゲームに組み込む
2011年11月24日 (木) | 編集 |
ちょっと関係ないんですが、エフェクト制作ツールのEffekseerの情報が少なかったので、
組み込み方法とかメモしときます。
色々間違ってるかも。
~lib制作~


DirectX SDKが必要なのでダウンロードしておく


Visual Studio 2008起動


ファイル>新規作成>既存のコードからプロジェクトを作成

プロジェクトファイルの場所>~\Effekseer017\Runtimeを選択

プロジェクト名>(任意)

プロジェクトビルドの方法
VisualStudioを使用する>プロジェクトの種類>スタティックライブラリ(LIB)プロジェクトを選択>完了



プロジェクト>プロジェクト名のプロパティ

構成>全ての構成
構成プロパティ>C/C++>追加のインクルードディレクトリ
Microsoft DirectX SDK内の[Include]と[Lib\x86]をインクルードします。
[Effekseer017\Runtime\includ]もインクルードします。(2012/2/7追記)
(↓組み込み側のプロジェクトに合わせる。ここではDXライブラリと同じ設定にします)
構成プロパティ>全般>文字セット>マルチバイト文字セット>適応
構成>Release
構成プロパティ>C/C++>コード生成>ランタイム ライブラリ>マルチスレッド(/MT)>適応
構成>Debug
構成プロパティ>C/C++>コード生成>ランタイム ライブラリ>マルチスレッドデバッグ(/MTd)>OK


F7キーでソリューションのビルドを行う。
DebugモードからReleaseモードに変更してもう一度ビルドする。


\Effekseer017\Runtime内にDebugフォルダとReleaseフォルダが出来る。
両フォルダ内の(プロジェクト名).libをそれぞれ
[Effekseer.Debug.lib][Effekseer.Release.lib]にして
組み込みたいプロジェクトのインクルードフォルダに入れる。

他にも\Effekseer017\Runtime\include内の[Effekseer.h][EffekseerRendererDX9.h]と、
Microsoft DirectX SDK内の[d3d9.h][d3d9caps.h][d3d9types.h][d3dx9.h]
[d3d9.lib][d3dx9.lib]も同じくインクルードフォルダに入れる。
(抜けあるかも)




~コード例~


//インクルード宣言
#include
#include
#pragma comment(lib, "d3d9.lib" )
#pragma comment(lib, "d3dx9.lib" )

#include Effekseer.h←<>で囲む
#include EffekseerRendererDX9.h←<>で囲む

#if _DEBUG
#pragma comment(lib, "Effekseer.Debug.lib" )
#else
#pragma comment(lib, "Effekseer.Release.lib" )
#endif

//変数宣言
Effekseer::Manager* efk_manager=NULL;
EffekseerRenderer::Renderer* efk_renderer=NULL;
Effekseer::Effect* efk_effect=NULL;
Effekseer::Handle efk_handle=-1;

//エフェクト関連を初期化
//描画用インスタンスの生成
efk_renderer=EffekseerRenderer::Renderer::Create((LPDIRECT3DDEVICE9)GetUseDirect3DDevice9(),2000);
//エフェクト管理用インスタンスの生成
efk_manager=Effekseer::Manager::Create(2000);
//描画用インスタンスから描画機能を設定
efk_manager->SetSpriteRenderer(efk_renderer->CreateSpriteRenderer());
efk_manager->SetRibbonRenderer(efk_renderer->CreateRibbonRenderer());
//描画用インスタンスからテクスチャの読み込み機能を設定(独自拡張可能、現在はファイルから読み込んでいる)
efk_manager->SetTextureLoader(efk_renderer->CreateTextureLoader());
//座標系の指定(LH=左手座標系,RH=右手座標系)
efk_manager->SetCoordinateSystem(Effekseer::COORDINATE_SYSTEM_LH);


//毎回やる
RenderVertex();//エフェクトの頂点バッファに溜まった頂点データを吐き出す

//再生
efk_effect=Effekseer::Effect::Create(efk_manager,(const EFK_CHAR*)L"01.efk");// エフェクトの読込
efk_handle=efk_manager->Play(efk_effect,0.0f,0.0f,0.0f);//エフェクトの再生
ES_SAFE_RELEASE(efk_effect);// エフェクトを解放(再生中の場合は再生終了時に自動的に解放)

//エフェクト調整
efk_manager->SetLocation(efk_handle,0.0f,0.0f,0.0f);//位置
efk_manager->SetRotation(efk_handle,Effekseer::Vector3D(0.0f,0.0f,0.0f),0.0f);//回転
efk_manager->SetScale(efk_handle,0.0f,0.0f,0.0f);//倍率

//カメラなど調整
//投影行列を設定
efk_renderer->SetProjectionMatrix(Effekseer::Matrix44().PerspectiveFovLH(GetCameraFov(),800.0f/600.0f,GetCameraNear(),GetCameraFar()));
//カメラ行列を設定
efk_renderer->SetCameraMatrix(Effekseer::Matrix44().LookAtLH(Effekseer::Vector3D(0.0f,50.0f,-50.0f),Effekseer::Vector3D(0.0f,0.0f,0.0f),Effekseer::Vector3D(0.0f,1.0f,0.0f)));

//描画
efk_manager->Update();//エフェクトの更新処理
efk_renderer->BeginRendering();//エフェクトの描画開始処理
efk_manager->Draw();//エフェクトの描画
efk_renderer->EndRendering();//エフェクトの描画終了処理



~その他~


・DirectXは左手座標系。

・テクスチャを入れたフォルダは実行ファイルのあるフォルダにないと駄目??

・↓の処理はそれぞれ[共通]の[位置への影響][回転への影響][拡大への影響]が[なし]だと適応されない。
 efk_manager->SetLocation(efk_handle,0.0f,0.0f,0.0f);//位置
 efk_manager->SetRotation(efk_handle,Effekseer::Vector3D(0.0f,0.0f,0.0f),0.0f);//回転
 efk_manager->SetScale(efk_handle,0.0f,0.0f,0.0f);//倍率
 サンプルの[Laser01.efkproj]だと[レーザー粒子][周囲パーティクル]
 は回転と拡大への影響が[なし]になっているのでそのままだと適応されない。

・↓みたいなのがあると便利かも
//DxLib::VECTORをEffekseer::Vector3Dに変換
Effekseer::Vector3D DXLtoEFK(DxLib::VECTOR v){
return Effekseer::Vector3D(v.x,v.y,v.z);
}

・投影行列について

//投影行列を設定する。
virtual void SetProjectionMatrix( const ::Effekseer::Matrix44& mat ) = 0;
//射影行列化(左手系)
Matrix44& PerspectiveFovLH( float ovY, float aspect, float zn, float zf );
float ovY>カメラの視野角
float aspect>画面サイズ??
float zn>カメラの Near クリップ面(カメラからこの値より近いポリゴンは描画されない
float zf>カメラの Far クリップ面(カメラからこの値より遠いポリゴンは描画されない

↓こんな感じで使う
efk_renderer->SetProjectionMatrix(Effekseer::Matrix44().PerspectiveFovLH(GetCameraFov(),800.0f/600.0f,GetCameraNear(),GetCameraFar()));
GetCameraFov()、GetCameraNear()、GetCameraFar()はDXライブラリの関数でそれぞれの値を取得する。
DXライブラリのクリップ面はデフォだと50~20000くらいなのでNear値は1位にした方がいいかも>SetCameraNearFar(1.0f,20000.0f);


・カメラ行列について

//カメラ行列を設定する。
virtual void SetCameraMatrix( const ::Effekseer::Matrix44& mat ) = 0;
//カメラ行列化(左手系)
Matrix44& LookAtLH( const Vector3D& eye, const Vector3D& at, const Vector3D& up );
const Vector3D& eye>カメラの位置
const Vector3D& at>注視点の位置
const Vector3D& up>カメラの上向き(普通はY軸が上向きなのでVector3D(0.0f,1.0f,0.0f))

↓こんな感じで使う
efk_renderer->SetCameraMatrix(Effekseer::Matrix44().LookAtLH(DXLtoEFK(GetCameraPosition()),DXLtoEFK(GetCameraTarget()),DXLtoEFK(GetCameraUpVector())));


・任意のファイル名を読み込む例(ワイド文字列への変換)
int e=1;//1番目のエフェクトを読み込む
string s="data/efk/e0000.efk";
s[11]=48+(e/100)%10; s[12]=48+(e/10)%10; s[13]=48+e%10;
char* strC=_strdup(s.c_str());//文字列格納バッファ
WCHAR strW[32];
size_t Len=0;
mbstowcs_s(&Len,strW,32,strC,_TRUNCATE);//変換
efk_effect=Effekseer::Effect::Create(efk_manager,(const EFK_CHAR*)strW);// エフェクトの読込

・エフェクト読み込みのタイミングでエラー「Assertion filed!」
Effekseerのバージョン違い、lib制作の失敗など?
もう一度libを作ったら直った。

(2012/9/14追記)
・バージョン0.311
EffekseerSound.SoundVoice.cpp>#include <math.h>を追加
EffekseerRenderer.RendererImplemented.h>#include <xmmintrin.h>を追加

コメント
この記事へのコメント
>>・任意のファイル名を読み込む例(ワイド文字列への変換)
メモリリークを起こさないために、
char* strC=_strdup(s.c_str());//文字列格納バッファ
を使用せずに、
mbstowcs_s(&Len,strW,32,s.c_str(),_TRUNCATE);//変換
の方がBetterではないでしょうか?
2014/07/09(水) 00:03:47 | URL | TANS #-[ 編集]
そうなんですか!? 試してみます!
教えてくれてありがとうございます('▽')
2014/07/17(木) 22:57:19 | URL | もっち #vdA3aT7k[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック