Visual Studio 2017 でLquidFunを動作させるまで


概要

この記事ではLiquidFunをVisual Studio 2017で動作させる手順を記す。言語はC++。LiquidFunとはGoogleが作った流体シミュレーションが可能な物理エンジンで、Box2Dの機能拡張版である。あくまで動作させるのはLiquidFunだけなので描画に関してはこの記事では扱わない。

環境

Windows10

Visual Studio 2017 のダウンロード&インストール

LiquidFunのダウンロード

このページからダウンロードする。
https://github.com/google/liquidfun/releases/tag/v1.1.0
ページ一番下のAssetsのliquidfun-x.x.x.zipをダウンロード。

LiquidFunのビルド

ビルドにはふつうCMakeというものを使うらしいが、使わなくてもVisual Studioだけでできたので今回はこちらの方法を使う。できない場合は
http://freesoft-48784.hatenablog.com/entry/2018/09/01/043454
この記事あたりを参考にして頑張る。

ダウンロードしてきたzipファイルを解凍する。(7-zip等の解凍ソフトを使う)
その後liquidfun-x.x.x/liquidfun/Box2DにあるBox2D.slnを開く。(Visual Studio 2017で開くはず。開かない場合は右クリック→プログラムから開くでVisual Studio 2017を選択)
するとソリューション操作の再ターゲット画面が表示される。特にいじらずOKを押して良い。

Visual Studioの出力画面で再ターゲットが正常に終了した事を確認すること。

続いてソリューションエクスプローラーの「Box2D」プロジェクトを右クリックしてプロパティを選択。

「C/C++」の「全般」の中にある警告をエラーとして扱うを「いいえ(/WX-)」に変更する。

変更したらOKを押してプロパティウィンドウを閉じ、もう一度「Box2D」プロジェクトを右クリックして「ビルド」を選択。ビルドが始まるのでしばらく待ち、正常終了を確認する。

これによりliquidfun-x.x.x/liquidfun/Box2D/Box2D/Debugにliquidfun.libファイルが生成されたはず。これはデバッグ用のライブラリファイルなのでリリース用が欲しい場合は設定をReleaseに切り替えて同じ手順を踏み生成すること。

LiquidFunの動作確認

LiquidFunが正常に動作するかを確認する。確認するだけなのでこの項は必須ではない。必要ない場合はこの項は読み飛ばして良い。
ソリューションエクスプローラーの「Testbed」プロジェクトを上記と同様の手順でビルドする。
正常終了を確認したらもう一度「Testbed」プロジェクトを右クリックし、「スタートアッププロジェクトに設定」を選択する。
そしてツールバーの「ローカルWindowsデバッガー」をクリックするとTestbedが実行される。TestbedはLiquidFunのサンプルプログラムで色々な使い方が紹介されている。結構遊べる。

プロジェクトにLiquidFunを導入する

Visual Studio 2017を再起動し、新しいプロジェクトを作成する。(Visual C++のからのプロジェクトを作るのが無難)
続いてプロジェクトのフォルダを開き、プロジェクト名.slnが置いてあるフォルダにliquidfun-x.x.x/liquidfun/Box2D/Box2Dフォルダをコピーする。Box2Dフォルダは二つあるので注意すること。下の階層のものが正解。
次にVisual Studioに戻り、ソリューションエクスプローラーのソリューション名を右クリック(プロジェクト名の上にある)→「追加」→「既存のプロジェクト」を選択する。

そして先ほどコピーしたBox2Dフォルダ内のBox2D.vcxprojを指定する。
これで「Box2D」プロジェクトがソリューションエクスプローラー内に表示されたはずである。
次に自分で作ったプロジェクトのプロパティを開き、「C/C++」→「全般」→「追加のインクルードディレクトリ」を押して右端の下向き矢印(v)を押して「<編集...>」を選択。「新しい行」のアイコンを押して右の「...」を選択するとディレクトリの選択画面が開くため、プロジェクトのフォルダ(プロジェクト名.slnファイルが入っているフォルダ)を指定する。

続けてプロパティの「リンカー」→「全般」→「追加のライブラリディレクトリ」→「<編集...>」→「新しい行(アイコン)」→「...」と先ほどと同じ手順で選択し、コピーしたBox2Dフォルダ内のDebugフォルダを選択する。(リリース版ならReleaseフォルダを選択)
これでLiquidFunの導入は完了。

導入したLiquidFunの動作をチェックする

最後にliquidFunの動作をチェックするため簡単なコードを書いて実行する。
まずはプロジェクト名を右クリックして「追加」→「新しい項目」でmain.cppファイルをプロジェクトに追加する。
次にファイルの行の先頭に

main.cpp
#include <Box2D/Box2D.h>
#pragma comment(lib,"liquidfun.lib")

を書き込む。(この時点でエラーが出ている場合は何かが上手くいっていない)
後はLiquidFunを使ったコードを書くだけ。今回はBox2Dソリューションの中にあったHello Worldプロジェクトのコードをコピーしてきた。

main.cpp
#include <iostream>
#include <Box2D/Box2D.h>
#pragma comment(lib,"liquidfun.lib")
using namespace std;
int main() {
    b2Vec2 gravity(0.0f, -10.0f);
    b2World world(gravity);
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0.0f, -10.0f);
    b2Body* groundBody = world.CreateBody(&groundBodyDef);
    b2PolygonShape groundBox;
    groundBox.SetAsBox(50.0f, 10.0f);
    groundBody->CreateFixture(&groundBox, 0.0f);
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(0.0f, 4.0f);
    b2Body* body = world.CreateBody(&bodyDef);
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(1.0f, 1.0f);
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);
    float32 timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;
    for (int32 i = 0; i < 60; ++i)
    {
        world.Step(timeStep, velocityIterations, positionIterations);
        b2Vec2 position = body->GetPosition();
        float32 angle = body->GetAngle();
        //printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
        cout << position.x << " " << position.y << " " << angle << "\n";
    }
    system("pause");
    return 0;
}

※テスト用のコードなのでコメント行や空行をほぼ消しています。
これを「ローカルWindowsデバッガー」で実行すればコンソールにボックスが落下する様子が表示される。

Hello Worldコードの詳細については公式リファレンスを参照。

参考資料

LiquidFun公式リファレンス
LiquidFun + DXライブラリ導入編
プログラム関連の覚え書き集