FarseerPhysicsEngineをMonoGameで使う

現在MonoGameで唯一使えるといえる2D物理エンジンはFarseerPhysicsEngineぐらいです。

もともと、XNA用として作られていたのですがXNAを受け継いだMonoGameならなんとかできるはずだ!とがんばったらなんとかなりました。

というわけで導入までの手順を

FarseerPhysicsEngine.Portable

FarseerPhysicsEngineは現在バージョン3.5.1が最新ですが、MonoGameのサンプルは一応WindowsDesktopのみ存在します。

どうせならPCLでクロスプラットフォームとして使いたいのですが公式は対応していません。

というわけでcraftworkgameさんが公開しているFarseerPhysicsEngine.Portableを利用しましょう。

一応Nugetでも公開してるっぽいですが少し修正しなきゃなところがあるのでZipでダウンロード

プロジェクトへの参照を追加します。

Worldクラスの編集

普通に実行するとWorldクラスのUpdateTimeがずっと0のままで意味不明状態になります。

なぜかというと、StopwatchというクラスがFarseerPhysicsEngine.Portableにはあるのですが、これはもともと.NetのStopwatchクラスがSilverlightで動かなかったから自作したやつらしく、今回の場合、このStopwatchのせいでMonoGame上で動かないです。

 

なのでWorldクラスが持っていStopwatchクラスをSystem.Diagnotics名前空間のやつにしましょう。

WorldクラスのフィールドのところのStopwatchに名前空間を明示的に指定してやります。

これでUpdateTimeがちゃんと動くようになりました。

DebugView

物理エンジンが今どんな計算をしているのかを視覚的に表現できるDebugViewが便利なので使いましょう。

以下の3つのクラスを追加します。

DebugViewXNA.cs

DebugViewXNAクラスではarialというスプライトフォントを使います。追加しておきましょう

 

PrimitiveBatch.cs

Camera2D.cs

実行する

あとはゲーム画面のクラスから、

Worldの初期化、オブジェクトの追加、DebugViewの初期化、カメラの初期化をします。

Updateメソッド(1秒間に60回よばれるやつ)でWorldの更新とカメラの更新を行います。

Drawメソッド(1秒間に60回呼ばれるやつ)でDebugViewの描画を行います。

7

 

 

FarseerPhysicsEngine.Portableさえ動いてしまえば、あとは公式のサンプルなり、ドキュメントなりの知識が使えるのでOKです。