effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
HI魔神
記事: 30
登録日時: 11年前
住所: 福井(大都会)

effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

#1

投稿記事 by HI魔神 » 10年前

やりたいこと
・effekseerで製作したエフェクトをDXライブラリのプログラム上で使用したい。

やったこと
1.DXSDK_Jun10をダウンロード・インストールした。
2.追加のインクルードディレクトリに展開されたヘッダーファイルとdllファイルを追加した。

この状態で以下のコードをコンパイルするとエラーが出ます。
サンプルプログラムとしてeffekseerのフォルダに同梱されていたものです。
main.cpp

コード:


//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
#include "DxLib.h"

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib" )
#pragma comment(lib, "d3dx9.lib" )

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
#include <Effekseer.h>
#include <EffekseerRendererDX9.h>

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

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
static int g_window_width = 640;
static int g_window_height = 480;
static ::Effekseer::Manager*			g_manager = NULL;
static ::EffekseerRenderer::Renderer*	g_renderer = NULL;
static ::Effekseer::Effect*				g_effect = NULL;
static ::Effekseer::Handle				g_handle = -1;

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
void DeviceLostFunction( void *Data )
{
	printf("Start LostFunction\n");
	// デバイスロストが発生した時に呼ぶ。
	g_renderer->OnLostDevice();

	// 読み込んだエフェクトのリソースは全て破棄する。
	g_effect->UnloadResources();

	// DXライブラリは内部でデバイス自体を消去しているのでNULLを設定する。
	g_renderer->ChangeDevice( NULL );

	printf("End LostFunction\n");
}

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
void DeviceRestoreFunction( void *Data )
{
	printf("Start RestoreFunction\n");

	// DXライブラリは回復時に内部でデバイスを再生成するので新しく設定する。
	LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9();
	g_renderer->ChangeDevice( device );

	// エフェクトのリソースを再読み込みする。
	g_effect->ReloadResources();

	// デバイスが復帰するときに呼ぶ
	g_renderer->OnResetDevice();
	printf("End RestoreFunction\n");
}

//----------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------------
int main()
{
	// ウィンドウモードに変更
	ChangeWindowMode( true );					

	// 初期化
    if( DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0 ) return -1;
	
	// 描画用インスタンスの生成
	LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9();
	g_renderer = ::EffekseerRenderer::Renderer::Create( device, 2000 );

	// フルスクリーンウインドウの切り替えでリソースが消えるのを防ぐ
	SetChangeScreenModeGraphicsSystemResetFlag( FALSE );

	// エフェクト管理用インスタンスの生成
	g_manager = ::Effekseer::Manager::Create( 2000 );

	// 描画用インスタンスから描画機能を設定
	g_manager->SetSpriteRenderer( g_renderer->CreateSpriteRenderer() );
	g_manager->SetRibbonRenderer( g_renderer->CreateRibbonRenderer() );
	g_manager->SetRingRenderer( g_renderer->CreateRingRenderer() );
	g_manager->SetModelRenderer( g_renderer->CreateModelRenderer() );
	g_manager->SetTrackRenderer( g_renderer->CreateTrackRenderer() );

	// 描画用インスタンスからテクスチャの読込機能を設定
	// 独自拡張可能、現在はファイルから読み込んでいる。
	g_manager->SetTextureLoader( g_renderer->CreateTextureLoader() );
	g_manager->SetModelLoader( g_renderer->CreateModelLoader() );

	// デバイスロスト時のコールバック設定(フルスクリーンウインドウ切り替えのために必要)
	SetGraphicsDeviceLostCallbackFunction( DeviceLostFunction, NULL );
	SetGraphicsDeviceRestoreCallbackFunction( DeviceRestoreFunction, NULL );

	// 投影行列を設定
	g_renderer->SetProjectionMatrix(
		::Effekseer::Matrix44().PerspectiveFovRH( 90.0f / 180.0f * 3.14f, (float)g_window_width / (float)g_window_height, 1.0f, 50.0f ) );
	
	// カメラ行列を設定
	g_renderer->SetCameraMatrix(
		::Effekseer::Matrix44().LookAtRH( ::Effekseer::Vector3D( 10.0f, 5.0f, 20.0f ), ::Effekseer::Vector3D( 0.0f, 0.0f, 0.0f ), ::Effekseer::Vector3D( 0.0f, 1.0f, 0.0f ) ) );
	
	// エフェクトの読込
	g_effect = Effekseer::Effect::Create( g_manager, (const EFK_CHAR*)L"test.efk" );

	// 何でもいいから画像読込
	int grHandle = LoadGraph( L"Texture/Particle01.png" );

	// 時間の設定
	int time = 0;

	bool isFullScreen = false;

	while( !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE) )
	{
		// 定期的にエフェクトを再生
		if( time % 60 == 0 )
		{
			// エフェクトの再生
			g_handle = g_manager->Play( g_effect, 0, 0, 0 );
		}

		// 何でもいいのでTransFragを有効にして画像を描画する。
		// こうして描画した後でないと、Effekseerは描画できない。
		DrawGraph( 0, 0, grHandle, TRUE );

		// 頂点バッファに溜まった頂点データを吐き出す
		RenderVertex();
		
		// エフェクトの移動処理を行う
		g_manager->AddLocation( g_handle, ::Effekseer::Vector3D( 0.2f, 0.0f, 0.0f ) );

		// エフェクトの更新処理を行う
		g_manager->Update();
			
		// エフェクトの描画開始処理を行う。
		g_renderer->BeginRendering();

		// エフェクトの描画を行う。
		g_manager->Draw();

		// エフェクトの描画終了処理を行う。
		g_renderer->EndRendering();
		
		// DXライブラリの設定を戻す。
		RefreshDxLibDirect3DSetting();

		// スクリーン入れ替え
		ScreenFlip();

		// 時間経過
		time++;

		// フルスクリーン切り替え
		if( CheckHitKey(KEY_INPUT_F1) && !isFullScreen )
		{
			ChangeWindowMode( FALSE );
			SetDrawScreen(DX_SCREEN_BACK);
			isFullScreen = true;
		}
		if( CheckHitKey(KEY_INPUT_F2) && isFullScreen )
		{
			ChangeWindowMode( TRUE );
			SetDrawScreen(DX_SCREEN_BACK);
			isFullScreen = false;
		}
	}

	// エフェクトの破棄
	ES_SAFE_RELEASE( g_effect );

	// エフェクト管理用インスタンスを破棄
	g_manager->Destroy();

	// 描画用インスタンスを破棄
	g_renderer->Destory();

	DxLib_End();

	return 0;
}

エラー内容
1>EffekseerRendererDX9.Debug.lib(EffekseerRenderer.TextureLoader.obj) : error LNK2019: 未解決の外部シンボル _D3DXCreateTextureFromFileInMemory@16 が関数 "public: virtual void * __thiscall EffekseerRenderer::TextureLoader::Load(unsigned short const *)" (?Load@TextureLoader@EffekseerRenderer@@UAEPAXPBG@Z) で参照されました。

このエラーはどうやって解決すればよいのでしょうか?どこが悪いのかすらもさっぱりわかりません。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

#2

投稿記事 by ISLe » 10年前

エラーメッセージに出力されているシンボルは、d3dx9.libに含まれているはずのものです。
d3dx9.libのリンク指示は、ソースファイル内に記述されています。
HI魔神 さんが書きました:2.追加のインクルードディレクトリに展開されたヘッダーファイルとdllファイルを追加した。
問題があるのはこちらの作業内容だと思います。
通常はインストールした先のフォルダの名前(場所)を設定します。
ファイル自体に触れないはずなので間違った作業をした可能性があります。

あと、使用している開発環境が分かりませんが、Visual Studioの2012以降だとツールセットの変更が必要だったような気がします。

HI魔神
記事: 30
登録日時: 11年前
住所: 福井(大都会)

Re: effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

#3

投稿記事 by HI魔神 » 10年前

書き忘れていました。環境はvisual stdio 2010 、windows8 64bitです。

私が行った手順は
1.DXSDK をインストールする(場所”C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)”)。
2."全ての構成"の"c/c++"の"全般"の追加のインクルード ディレクトリに
”C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64”//libファイルが入っている
”C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86”//libファイルが入っている
”C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include”//ヘッダーファイルが入っている
を追加し、okを押す。

3."全ての構成"の"リンカー"の"全般"の追加のライブラリ ディレクトリで同じ作業を行う。

これだけの事しかやっていません。
これらの場所を間違えている可能性がある、ということなのでしょうか?

追加で質問なのですが、リンク指示とは何ですか?勉強不足ですみません。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

#4

投稿記事 by ISLe » 10年前

インクルードディレクトリにはIncludeのパスだけ、ライブラリディレクトリにはLib\x86のパスだけ、を設定してください。

DXライブラリは64bitに対応していないのでLib\x64は不要です。
Lib\x64には同名のライブラリファイルが存在し中身が異なるため質問に書かれたエラーが発生していると思われます。

ちなみに、ここでのx86/x64は作成する実行形式に対してのことで、OSとは無関係です。

リンク指示とは
#pragma comment(lib, "d3dx9.lib" )
のことです。
この場合、追加のライブラリファイルとしてd3dx9.libをリンクするという指示になります。
この情報はコンパイルして作成されたオブジェクトファイルにも記憶されます。

HI魔神
記事: 30
登録日時: 11年前
住所: 福井(大都会)

Re: effekseerをDXライブラリで使用したいのですが、エラーが出てしまいます。

#5

投稿記事 by HI魔神 » 10年前

ありがとうございます。無事二つウィンドウが出てきて(コードが読めないので正しいのかわかりませんが)、デバッグは成功しました。
しかしtest.efkをmain.cppがあるフォルダに入れても再生されません。
どうやら読み込みが正常に行われていないようです。もう少し勉強して分からなかったらまた場を変えて質問させていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る