Cocos 2 dのChipMunk

49469 ワード

ChipMunk
直接に当点をあげて、みんなに概念を普及させて、ChipMunkは1つの物理のエンジンで、BOX 2 Dのこのように、chipmunkはもともと1つの独立したオープンソースのプロジェクトで、純粋なcで編纂します.cococos 2 dはchipmunkとbox 2 dの2つの物理エンジンを同時に統合した.それに比べてchipmunkの方が軽量で使いやすいです.
簡単な概念を紹介します.
space:これは仮想物理空間であり、すべての剛体(body)、形状(shape)、接続(joint)がこの空間で物理イベントを発生する.body:剛体物理的には、剛体は物理例の実体単位として抽象化するが、剛体は形状(shape)を有し、回転可能であるため、真の粒子とは異なる.また、剛体には最も基本的な物理的属性であるshape:剛体の形状が付随.剛体同士の衝突は、剛体の形状外延を衝突臨界とする.1つのリジッドボディは、複数のshapeを付加する複雑なリジッドボディの外形を形成することができる.同じリジッドボディに属する形状同士の衝突は発生しない.joint:連結、2つ以上の剛体が連結する、例えば1つの鎖は、複数の剛体の鉄環からなる.具体的なjointの使用は、まだ深く研究されていない.
Chipmunkはどのように働いていますか?Chipmunkは「仮想Chipmunk空間」で物理的挙動をシミュレートした.この空間に物体を追加する必要がありますたとえば、動物、花、またはぬいぐるみの形を表します.Chipmunkこれらの物体にどのような力の作用を受けたかを教えます.重力、風、宇宙人の引力光線など.たまにChipmunkにシミュレーション結果を更新する時間を与える.例えば、Chipmunkは動物が前の時刻に比べて距離を落としたと演算する可能性があり、花が風の中でかすかに傾き、Gonzoが空に引っ張られる可能性がある.物理シミュレーションの結果に基づいて、あなたの「真実」のCocos 2 D世界を更新します.たとえば、Chipmunkがシミュレートした仮想物体の位置と同じように、動物、花、またはぬいぐるみの精霊の位置を設定します.上で理解すべき最も重要な点は,Chipmunk空間とCocos 2 D空間が全く異なることである.Bodies and Shapesリジッドボディと形状コードを深く研究する前に、Chipmunkのリジッドボディと形状の概念を理解する必要があります.一つのChipmunk剛体はChipmunk仮想世界の一つの物体を代表している.リジッドボディは、次の図に示すように、1つまたは複数のChipmunk形状を含んでその幾何学的定義を表すことができる.この図は、猫のベッドを表すChipmunk剛体を示しています.ベッドの左側部分、右側部分、ベッドの底部の3つのChipmunk形状が含まれています.2つのChipmunkリジッドボディがあります.ダイナミックリジッドボディは移動可能です.ほとんどの場合に使用されます.静的リジッドボディは永遠に移動しません.通常、ゲーム内の地面や他の永久静止装置を作成するために使用されます.Chipmunkリジッドボディごとに、その品質を定義できます.品質が大きいほど、移動が難しくなり、重くなります.シェイプを作成すると、長方形のボックス、円形、多角形を作成できます.段落(厚みのある直線セグメント).各シェイプについて、弾性:オブジェクトの弾力性を表します.0に設定すると、少しも弾性がありません.1に設定すると、オブジェクトは同じ反発力で反発します.1より大きく設定すると、より大きな力で反発します.摩擦:オブジェクトがどれだけ滑っているかを示します.0に設定すると、それはかなり滑らかです.1以上に設定すると、少しも滑りません.
Cocos 2 d-x Chipmunkサンプルコードの概要Chipmunkシーンに物体を追加する方法を初めて見たので、少しずつ勉強しましょう.物体がスクリーンから落ちないように壁を作ります.Chipmunk空間に様々な形状を追加します.タッチイベントを設定し、画面をクリックしたときに精霊を追加できるようにします.以下の工程は、cococos 2 d−xの例示的な工程においてChipmunkTestと命名される.Chipmunk空間を作成するには、物理的な動作をシミュレートするための仮想Chipmunk空間を作成します.Chipmunk空間をオブジェクトcpSpaceで表します.作成して初期化するだけです.ヘッダファイル(ここではChipmunkTest.h)を切り替え、以下の変更を行います.

  
  
  
  
  1. // At top of file
  2. #include "chipmunk.h"
  3. // Inside @interface
  4. cpSpace* m_pSpace;

ここでは、chipmunkヘッダファイルを導入し、インスタンス変数を宣言してChipmunk空間を記録するだけです.よく使用するからです.次にcppファイル(ChipmunkTest.cpp)に切り替え、次のように変更します.

  
  
  
  
  1. void ChipmunkTestLayer::initPhysics()
  2. {
  3. #if CC_ENABLE_CHIPMUNK_INTEGRATION
  4. // init chipmunk
  5. //cpInitChipmunk();
  6. m_pSpace = cpSpaceNew();
  7. m_pSpace->gravity = cpv(0, -100);
  8. // Physics debug layer
  9. m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace);
  10. this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG);
  11. #endif
  12. }

最初の行はcpSpaceNewメソッドを呼び出して、インスタンス変数に格納する新しいChipmunk仮想空間を作成します.2行目にChipmunk空間を設置する重力は、x軸方向がなく、y軸方向が適切である.ここで設定した値は、ゲームの「正しい感覚」に大きく影響します.「壁」を追加することは多くのゲームにとって、Chipmunk空間に「壁」を表す物体を追加するのに非常に役立ちます.たとえば、このゲームでは、左下から右下に延びる線分形状を作成するつもりです.これにより、スクリーンから落ちるのではなく、物理的に地面に衝突することができます.地面を追加するには、ChipmunkTestLayer::initPhysics()メソッドで次のように変更する必要があります.

  
  
  
  
  1. // rogue shapes
  2. // We have to free them manually
  3. //
  4. // bottom
  5. m_pWalls[0] = cpSegmentShapeNew( m_pSpace->staticBody,
  6. cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
  7. cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y), 0.0f);
  8. // top
  9. m_pWalls[1] = cpSegmentShapeNew( m_pSpace->staticBody,
  10. cpv(VisibleRect::leftTop().x, VisibleRect::leftTop().y),
  11. cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
  12. // left
  13. m_pWalls[2] = cpSegmentShapeNew( m_pSpace->staticBody,
  14. cpv(VisibleRect::leftBottom().x,VisibleRect::leftBottom().y),
  15. cpv(VisibleRect::leftTop().x,VisibleRect::leftTop().y), 0.0f);
  16. // right
  17. m_pWalls[3] = cpSegmentShapeNew( m_pSpace->staticBody,
  18. cpv(VisibleRect::rightBottom().x, VisibleRect::rightBottom().y),
  19. cpv(VisibleRect::rightTop().x, VisibleRect::rightTop().y), 0.0f);
  20. for( int i=0;i
  21. e = 1.0f;
  22. m_pWalls[i]->u = 1.0f;
  23. cpSpaceAddStaticShape(m_pSpace, m_pWalls[i] );
  24. }

リジッドボディ/シェイプを追加するには、シーンにダイナミック(移動可能)Chipmunkリジッドボディを追加するhelperメソッドを作成します.

  
  
  
  
  1. void ChipmunkTestLayer::addNewSpriteAtPosition(CCPoint pos)
  2. {
  3. #if CC_ENABLE_CHIPMUNK_INTEGRATION
  4. int posx, posy;
  5. CCNode *parent = getChildByTag(kTagParentNode);
  6. posx = CCRANDOM_0_1() * 200.0f;
  7. posy = CCRANDOM_0_1() * 200.0f;
  8. posx = (posx % 4) * 85;
  9. posy = (posy % 3) * 121;
  10. int num = 4;
  11. cpVect verts[] = {
  12. cpv(-24,-54),
  13. cpv(-24, 54),
  14. cpv( 24, 54),
  15. cpv( 24,-54),
  16. };
  17. cpBody *body = cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts, cpvzero));
  18. body->p = cpv(pos.x, pos.y);
  19. cpSpaceAddBody(m_pSpace, body);
  20. cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
  21. shape->e = 0.5f; shape->u = 0.5f;
  22. cpSpaceAddShape(m_pSpace, shape);
  23. CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 85, 121));
  24. parent->addChild(sprite);
  25. sprite->setCPBody(body);
  26. sprite->setPosition(pos);
  27. #endif
  28. }

これは第3歩とよく似ています.cpBodyNewメソッドを呼び出すだけで、画面をクリックするときにダイナミック(移動可能)なリジッドボディを作成できます.タッチイベントを設定するには、画面をタッチするときに新しいリジッドボディを作成する必要があります.この機能を実現する最も簡単な方法を示します.

  
  
  
  
  1. void ChipmunkTestLayer::ccTouchesEnded(CCSet* touches, CCEvent* event)
  2. {
  3. //Add a new body/atlas sprite at the touched location
  4. CCSetIterator it;
  5. CCTouch* touch;
  6. for( it = touches->begin(); it != touches->end(); it++)
  7. {
  8. touch = (CCTouch*)(*it);
  9. if(!touch)
  10. break;
  11. CCPoint location = touch->getLocation();
  12. addNewSpriteAtPosition( location );
  13. }
  14. }

ここでgetLocationを呼び出し,この方法はCocos 2 D座標系におけるタッチポイントの位置を返す.最終的には、addNewSpriteAtPositionメソッドを呼び出して、クリック先に精霊を追加します.コンパイルして実行コンパイルして実行!正常であれば、画面をクリックすると、剛体が地面に落ちて、弾いてから落ちるのが見えます.