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をダウンロード。
![コメント 2019-03-09 150259.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/f8456143-2889-647d-2419-dd68c2c9fe8c.jpeg)
#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を押して良い。
![コメント 2019-03-09 151427.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/9acd9eb4-3e84-8f3d-3c2e-60197e803c14.jpeg)
Visual Studioの出力画面で再ターゲットが正常に終了した事を確認すること。
![コメント 2019-03-09 151718.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/12a36934-0bb9-faae-5cb2-e15da686af3f.jpeg)
続いてソリューションエクスプローラーの「Box2D」プロジェクトを右クリックしてプロパティを選択。
![コメント 2019-03-09 152016.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/1faa976a-e2e4-72ae-3b48-f1691d53f66f.jpeg)
「C/C++」の「全般」の中にある警告をエラーとして扱うを「いいえ(/WX-)」に変更する。
![コメント 2019-03-09 152326.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/06bf178a-2ce0-c47d-5617-0ab423a72ed9.jpeg)
変更したらOKを押してプロパティウィンドウを閉じ、もう一度「Box2D」プロジェクトを右クリックして「ビルド」を選択。ビルドが始まるのでしばらく待ち、正常終了を確認する。
![コメント 2019-03-09 152545.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/d36ba620-f86e-2107-25a0-00fbb1a62e2b.jpeg)
これによりliquidfun-x.x.x/liquidfun/Box2D/Box2D/Debugにliquidfun.libファイルが生成されたはず。これはデバッグ用のライブラリファイルなのでリリース用が欲しい場合は設定をReleaseに切り替えて同じ手順を踏み生成すること。
##LiquidFunの動作確認
LiquidFunが正常に動作するかを確認する。確認するだけなのでこの項は必須ではない。必要ない場合はこの項は読み飛ばして良い。
ソリューションエクスプローラーの「Testbed」プロジェクトを上記と同様の手順でビルドする。
正常終了を確認したらもう一度「Testbed」プロジェクトを右クリックし、「スタートアッププロジェクトに設定」を選択する。
そしてツールバーの「ローカルWindowsデバッガー」をクリックするとTestbedが実行される。TestbedはLiquidFunのサンプルプログラムで色々な使い方が紹介されている。結構遊べる。
![コメント 2019-03-09 154410.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/2945aa6c-f8df-0874-d3a7-362049e8fdbf.jpeg)
#プロジェクトにLiquidFunを導入する
Visual Studio 2017を再起動し、新しいプロジェクトを作成する。(Visual C++のからのプロジェクトを作るのが無難)
続いてプロジェクトのフォルダを開き、プロジェクト名.slnが置いてあるフォルダにliquidfun-x.x.x/liquidfun/Box2D/Box2Dフォルダをコピーする。Box2Dフォルダは二つあるので注意すること。下の階層のものが正解。
次にVisual Studioに戻り、ソリューションエクスプローラーのソリューション名を右クリック(プロジェクト名の上にある)→「追加」→「既存のプロジェクト」を選択する。
![コメント 2019-03-09 155638.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/ea9eea3e-9c5c-97f2-9111-daa739d31748.jpeg)
そして先ほどコピーしたBox2Dフォルダ内のBox2D.vcxprojを指定する。
これで「Box2D」プロジェクトがソリューションエクスプローラー内に表示されたはずである。
次に自分で作ったプロジェクトのプロパティを開き、「C/C++」→「全般」→「追加のインクルードディレクトリ」を押して右端の下向き矢印(ｖ)を押して「<編集...>」を選択。「新しい行」のアイコンを押して右の「...」を選択するとディレクトリの選択画面が開くため、プロジェクトのフォルダ(プロジェクト名.slnファイルが入っているフォルダ)を指定する。
![コメント 2019-03-09 160714.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/38238068-854e-668d-e156-2dbf1b7c492e.jpeg)
続けてプロパティの「リンカー」→「全般」→「追加のライブラリディレクトリ」→「<編集...>」→「新しい行(アイコン)」→「...」と先ほどと同じ手順で選択し、コピーしたBox2Dフォルダ内のDebugフォルダを選択する。(リリース版ならReleaseフォルダを選択)
これでLiquidFunの導入は完了。
#導入したLiquidFunの動作をチェックする
最後にliquidFunの動作をチェックするため簡単なコードを書いて実行する。
まずはプロジェクト名を右クリックして「追加」→「新しい項目」でmain.cppファイルをプロジェクトに追加する。
次にファイルの行の先頭に

```c++:main.cpp
#include <Box2D/Box2D.h>
#pragma comment(lib,"liquidfun.lib")
```
を書き込む。（この時点でエラーが出ている場合は何かが上手くいっていない）
後はLiquidFunを使ったコードを書くだけ。今回はBox2Dソリューションの中にあったHello Worldプロジェクトのコードをコピーしてきた。

```c++: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デバッガー」で実行すればコンソールにボックスが落下する様子が表示される。
![コメント 2019-03-09 165609.jpg](https://qiita-image-store.s3.amazonaws.com/0/351431/44f32052-adbf-e64d-4dbd-eccb313a8080.jpeg)
Hello Worldコードの詳細については[公式リファレンス](https://github.com/google/liquidfun/blob/master/liquidfun/Box2D/Box2D/Documentation/Programmers-Guide/Chapter02_Hello_Box2D.md)を参照。
##参考資料
[LiquidFun公式リファレンス](https://github.com/google/liquidfun/tree/master/liquidfun/Box2D/Box2D/Documentation/Programmers-Guide)
[LiquidFun + DXライブラリ導入編](https://qiita.com/hart_edsf/items/7365b1c8030d0671eedc)
[プログラム関連の覚え書き集](http://freesoft-48784.hatenablog.com/entry/2018/09/01/043454)