PR

【DXライブラリ】Effekseerと連動してエフェクトを表示する

DXライブラリでEffekseerと連動してエフェクトを表示する方法について説明しています。Visual Studio 2022を使う前提です(2026にはDXライブラリがまだ対応していないため)。

専用のライブラリファイルをDL

Effekseerの公式サイトにアクセスしてDXライブラリ用のEffekseerライブラリファイルをダウンロードする。2026年4月25日時点での最新版は1.80.2.3.24f。

DXライブラリの3.24fとの対応なのでこれ以外のバージョンを使っている人は3.24fをダウンロードしてプロジェクトの設定をし直す。

ダウンロードしたDXライブラリ用Effekseerライブラリファイルを解凍したら、「プロジェクトに追加すべきファイル_VC用」フォルダ内にある

  • Effekseer***.lib
  • Effekseer***.h
  • Effekseer***およびLLGIのフォルダ

これらのファイルを全部コピーし、プロジェクト作成の際にプロパティの設定のインクルードディレクトリで指定したDXライブラリの*.lib/hがあるフォルダに貼り付ける。

次に上のメニューから「プロジェクト」→「***のプロパティ」を選択する。

「全般」を選択して「C++言語標準」を++17以上にする(17未満だとビルド時にエラーが出る)。

サンプルコード

それでは実装。Effekseerのライブラリに同封されているサンプルエフェクトを表示させてみる。

Effect.h/cpp を新たに追加する。

Effect.h

#ifndef DEF_EFFECT_H

#define DEF_EFFECT_H

void Effect_Initialize();
void Effect_Update();
void Effect_Draw();
void Effect_Finalize();

#endif

Effect.cpp

#include "DxLib.h"
#include "EffekseerForDXLib.h"

static int effectResourceHandle; //エフェクトリソース
static int grBackgroundHandle; //背面画像ソース
static int grFrontHandle; //前面画像ソース
static int playtime; //エフェクトの再生時間
static float position_x; //エフェクトのx座標
static float position_y; //エフェクトのy座標
static int playingEffectHandle; //再生するエフェクトのハンドル

static bool effekseerLoadSuccess; //Effekseerが正しく初期化されたかのフラグ

//エフェクトの初期化
void Effect_Initialize() {
    //Effekseerを初期化する
    if (Effekseer_Init(8000) == -1)
    {
        //初期化失敗
        effekseerLoadSuccess = false;
    }
    else {
        //初期化成功
        effekseerLoadSuccess = true;
    }

    // フルスクリーンウインドウの切り替えでリソースが消えるのを防ぐ。
    // Effekseerを使用する場合は必ず設定する。
    SetChangeScreenModeGraphicsSystemResetFlag(FALSE);

    // DXライブラリのデバイスロストした時のコールバックを設定する。
    // ウインドウとフルスクリーンの切り替えが発生する場合は必ず実行する。
    // ただし、DirectX11を使用する場合は実行する必要はない。
    Effekseer_SetGraphicsDeviceLostCallbackFunctions();

    // エフェクトリソースを読み込む。
    // 読み込む時に大きさを指定する。
    effectResourceHandle = LoadEffekseerEffect("読み込みたいEffekseerのファイルパス", 1.0f);

    // 何でもいいので画像を読み込む
    grBackgroundHandle = LoadGraph(_T("読み込みたい画像ファイルのパス"));
    grFrontHandle = LoadGraph(_T("読み込みたい画像のファイルパス"));

    // 時間を初期化する(定期的にエフェクトを再生するため)
    playtime = 0;

    // エフェクトの表示する位置を設定する。
    position_x = 0.0f;
    position_y = 0.0f;

    // 再生中のエフェクトのハンドルを初期化する。
    playingEffectHandle = -1;

    // Zバッファを有効にする。
    // Effekseerを使用する場合、2DゲームでもZバッファを使用する。
    SetUseZBuffer3D(TRUE);

    // Zバッファへの書き込みを有効にする。
    // Effekseerを使用する場合、2DゲームでもZバッファを使用する。
    SetWriteZBuffer3D(TRUE);
}

//エフェクトの更新
void Effect_Update() {
    if (!effekseerLoadSuccess) return;

    // DXライブラリのカメラを設定する。
    SetCameraPositionAndTarget_UpVecY(VGet(10, 10, -20), VGet(0, 0, 0));
    SetupCamera_Perspective(60.0f * DX_PI_F / 180.0f);
    SetCameraNearFar(1.0f, 150.0f);

    // DXライブラリのカメラとEffekseerのカメラを同期する。
    Effekseer_Sync3DSetting();

    // 定期的にエフェクトを再生する
    if (playtime % 60 == 0)
    {
        // エフェクトを再生する。
        playingEffectHandle = PlayEffekseer3DEffect(effectResourceHandle);

        // エフェクトの位置をリセットする。
        position_x = 0.0f;
    }

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

    // 再生中のエフェクトを移動する。
    SetPosPlayingEffekseer3DEffect(playingEffectHandle, position_x, position_y, 0);
    position_x += 0.2f;

    // Effekseerにより再生中のエフェクトを更新する。
    UpdateEffekseer3D();

    // 時間を経過させる。
    playtime++;
}

//エフェクトの描写
void Effect_Draw() {
    if (!effekseerLoadSuccess) return;

    // 3Dを表示する。
    DrawCapsule3D(
        VGet(0.0f, 100.0f, 0.0f), VGet(0.0f, -100.0f, 0.0f), 6.0f, 16, GetColor(100, 100, 100), GetColor(255, 255, 255), TRUE);

    // Effekseerにより再生中のエフェクトを描画する。
    DrawEffekseer3D();

    // エフェクトの上にも画像を描画できる。
    DrawGraph(0, 0, grFrontHandle, TRUE);
}

//エフェクトの終了処理
void Effect_Finalize() {
    if (!effekseerLoadSuccess) return;

    // エフェクトリソースを削除する。(Effekseer終了時に破棄されるので削除しなくてもいい)
    DeleteEffekseerEffect(effectResourceHandle);
}

EffekserrはDirectX11を使う必要がある(9EXとかも使えるが一部機能が使えない)ので System.cpp にDirectx11を使うよう指定する。

System.cpp

//DXライブラリなどの初期化
bool System_Intialize() {
    //略

    // DirectX11を使用するようにする。(DirectX9も可、一部機能不可)
    // Effekseerを使用するには必ず設定する。
    SetUseDirect3DVersion(DX_DIRECT3D_11);

    // DXライブラリ初期化処理
    if (DxLib_Init() < 0) {
        //エラーなら終了する
        return false;
    }

    //略
}

あとは Game.cpp に Effect.h/EffekseerForDXLib.h をインクルードして初期化・更新・描画・終了処理を呼ぶ。

サンプルエフェクトの見た目はこんな感じ。

注意点

Effekseerと連動するときに気を付けてほしいの以下の5つ。

  1. EffekseerForDXLib.hをインクルードすること
  2. Effekseerの初期化が必要であること
  3. DirectX11を使用する必要があること
  4. 2DゲームでもZバッファを使用しないといけないこと
  5. 何かしら画像を先に表示しないと正しく表示されないこと

1~3は当たり前だが4, 5は意外と忘れがちなので注意。

何でもいいので画像を先に表示しないといけないというのがちょっと気になるところ。まあダミー画像を用意してプレイヤーやマップなどの3Dモデル表示をする前に差し込んでおけばいいでしょう。

コメント

タイトルとURLをコピーしました