[AndEngine Box2d] 簡単なBody、複雑な形態のBodyをつくる その1

これを解決するのに相当の時間がかかったので忘れないようにメモ。

まず、Spriteを読み込んだ後の手続きとして そのSpriteの剛体の定義をBodyに行い、関連付けるという作業が必要である その為には色々手順を踏まなければならない。

 

(1)Spriteの頂点データの配列Vector2[]を作る

円、矩形はPhysicsFactory.createBoxBody、PhysicsFactory.createCircleBodyで作った方が手っ取り早い。 頂点数が8点以下の場合、PhysicsFactory.createPolygonBodyを使って作れるので、大抵はこれでまかなえるのではないかと思う。

ちなみに、「Andengine Vertex Helper」(Bodyの定義を簡単に行えるツール)を含む、Bodyの作り方は下記のサイトにて詳細に解説されている。感謝

http://goods-tmu.blogspot.jp/2014/03/andengine-vertex-helper.html

しかし、8点以上ある場合、具体的にどうやって作るのかを解説しているところがなく、苦戦した。まず、頂点データを作る時の注意事項はBox2dに共通なので是非確認したい。下記のサイトをよく参考にして作成するとよいだろう。

http://tech.nitoyon.com/ja/blog/2009/05/11/box2d-polygon/

・点を定義する順番に注意 ・凸包にせよ

・頂点数は8個まで(1シェイプあたり)

これは絶対守る必要がある。しかも、ビルト時にエラーになるのはオーバー8頂点ぐらいで、凹型のポリゴンデータとかは正常にビルトを通過し、物理シミュレーションがおかしくなるのみである。突き止めめるのに時間がかかる・・・。

頂点数が8個までとあるが、9点以上の場合は三角形(四角形でも五角形でも8点までならok。三角形がスタンダードとのこと)のシェイプを組み合わせてBodyを作る必要がある。

名称未設定-2

実際に、星型のスプライトのBodyを作る際、頂点数が10個の上に、凹型になるため、中心から10個の三角形で分けてみた。もう少しスマートに分けられる気がするが、とりあえずこれで行きたいと思う。右にコードがでているので、1-10の三角形のデータをソースに定義すればよい。参考まで1つ目の三角形のデータの定義を下に掲載。

        final Vector2[] vertices1 = {
        		new Vector2(-0.46000f*width, -0.11579f*height),
        		new Vector2(-0.19000f*width, -0.23684f*height),
        		new Vector2(+0.00000f*width, -0.00000f*height),

        };

 

(2)1つのVector2[]配列からBody.を作りSpriteと関連付ける(簡単なBody)

8点以下の場合は、三角形に分けることなく、このVector2[]配列をPhysicsFactory.createPolygonBodyに投げるとよい(下コード)。FIXTURE_DEFは、密度、弾性力、摩擦、センサー、カテゴリビット、カテゴリマスクビット、グループ番号ということらしい。つまり、SpriteKitのSKPhysicsBody関連の設定を行う。詳しくは

http://goods-tmu.blogspot.jp/2013/07/andengineextension.html

SpriteKitに相当する部分では

http://spritekit.senchan-office.com/index.php/skphysicsbody

で参考になる。

	private PhysicsWorld mPhysicsWorld;
     private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);

	// 8点以下の頂点数のBodyを作る
	private void addsp2(float x,float y){
		Sprite sp = getBaseActivity().getResourceUtil().getSprite("waku_star.png");
		sp.setPosition(x,y);


	 final float width = sp.getWidthScaled() / PIXEL_TO_METER_RATIO_DEFAULT;
	 final float height = sp.getHeightScaled() / PIXEL_TO_METER_RATIO_DEFAULT;


        final Vector2[] vertices2 = {
        		new Vector2(-0.46000f*width, -0.09474f*height),
        		new Vector2(+0.00500f*width, -0.45789f*height),
        		new Vector2(+0.45500f*width, -0.08947f*height),
        		new Vector2(+0.28000f*width, +0.42632f*height),
        		new Vector2(-0.27500f*width, +0.42632f*height),
        };

        final Body body  = PhysicsFactory.createPolygonBody(this.mPhysicsWorld, sp,vertices2 ,BodyType.DynamicBody, FIXTURE_DEF);
		attachChild(sp);
		this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sp, body, true, true));

	}

しかし、これではVector2[]配列が一つしか渡せないため、複数のVector2[]配列を用いたBodyがつくれない。それを、その2で説明する。

One thought on “[AndEngine Box2d] 簡単なBody、複雑な形態のBodyをつくる その1

Comments are closed.