¸¶¿ì½º Á¶ÀÎÆ®

"A" ¹Ú½º¸¦ ¸¶¿ì½º·Î µå·¡±× ÇÏ¿© ¸¶¿ì½º ¹öÆ°À» ¶¼¸é ¹Ú½º°¡ ¾Æ·¡·Î ¶³¾îÁø´Ù.
¸¶¿ì½º Á¶ÀÎÆ®¿¡ ´ëÇؼ­ ¾Ë¾Æ º»´Ù.

cocos2d-2.0-x-2.0.4/samples/TestCpp/Resources/Images Æú´õ¿¡¼­ blocks.png ÆÄÀÏÀ» º¹»çÇؿ´Ù.

¸¶¿ì½º Á¶ÀÎÆ® º¯¼ö

¸¶¿ì½º Á¶ÀÎÆ®¿¡ »ç¿ëµÇ´Â º¯¼ö¸¦ Ãß°¡ÇÏÀÚ.
mBody´Â ¸¶¿ì½º Á¶ÀÎÆ®¸¦ À§ÇØ »ç¿ëµÇ´Â °í½ºÆ® ¹Ùµð·Î ÀÌÇØÇÏÀÚ.( ÀÌ°Ç Á¤È®ÇÑ Á¤º¸´Â ¾Æ´Ô)

bool mDrag;
b2Body *mDragBody;
b2Body *mBody;
b2MouseJoint *mMouseJoint;

 

Á¶ÀÎÆ® »ý¼º

ÅÍÄ¡¸¦ Çϸé ÅÍÄ¡½Ã Æ÷ÀÎÅ͸¦ GetBodyAtTab(  ) ÇÔ¼ö¿¡ ³Ö¾îÁÖ¸é, ÇØ´ç ¹ÙµðÀÇ TestPoint¸¦ ½ÇÇàÇÑ´Ù.
GetBodyAtTab( ) ÇÔ¼ö´Â HelloWorld Ŭ·¡½º·Î ÅÍÄ¡ÇÑ ¹Ùµð¸¦ ³Ñ°ÜÁØ´Ù.

¹Ùµð°¡ ÀÖÀ¸¸é Á¶ÀÎÆ® b2MouseJoint ( mMouseJoint )¸¦ »ý¼ºÇÑ´Ù.

void HelloWorld::ccTouchesBegan( CCSet *pTouches, CCEvent* event)
{
    for( CCSetIterator it = pTouches->begin(); it != pTouches->end(); ++it)
    {
        CCTouch* touch = (CCTouch*)(*it);
        CCPoint touchPoint = touch->getLocation();

        if( b2Body *b = this->GetBodyAtTab( touchPoint))
        {
            mDragBody = b;
            mDrag = true;

            b2MouseJointDef md;
            md.bodyA = mBody;
            md.bodyB = mDragBody;
            md.target.Set( mDragBody->GetPosition().x, mDragBody->GetPosition().y);
            md.maxForce = 300.0f * mDragBody->GetMass();

            mMouseJoint = (b2MouseJoint*) mPhysicsWorld->CreateJoint( &md);
        }
    }
}

GetBodyAtTab( ) ÇÔ¼öÀÌ´Ù.

b2Body* HelloWorld::GetBodyAtTab( CCPoint p)
{
    b2Fixture *fix;
    for( b2Body *b = mPhysicsWorld->GetBodyList(); b; b = b->GetNext())
    {
        if( b->GetUserData() != NULL)
        {
            if( b->GetType() == b2_staticBody)
                continue;
            fix = b->GetFixtureList();
            if( fix->TestPoint( b2Vec2( p.x / PTM_RATIO, p.y / PTM_RATIO )))
                return b;
        }
    }

    return NULL;
}

 

Á¶ÀÎÆ® ¾÷µ¥ÀÌÆ®

ÅÍÄ¡ À§Ä¡°¡ ¹Ù²î¸é Á¶ÀÎÆ® À§Ä¡¸¦ ¾÷µ¥ÀÌÆ® ÇØÁØ´Ù.

void HelloWorld::ccTouchesMoved( CCSet *pTouches, CCEvent *event)
{
    for( CCSetIterator it = pTouches->begin(); it != pTouches->end(); ++it)
    {
        CCTouch* touch = (CCTouch*)(*it);
        CCPoint touchPoint = touch->getLocation();

        if( mDrag)
        {
            mMouseJoint->SetTarget( b2Vec2( touchPoint.x / PTM_RATIO, touchPoint.y / PTM_RATIO));
        }
    }
}

Á¶ÀÎÆ® ÇØÁ¦

ÅÍÄ¡ÇÑ ¼Õ°¡¶ôÀ» ¶¼¸é Á¶ÀÎÆ®¸¦ ÇØÁ¦ ÇÑ´Ù.

void HelloWorld::ccTouchesEnded( CCSet *pTouches, CCEvent *event)
{
    for( CCSetIterator it = pTouches->begin(); it != pTouches->end(); ++it)
    {
        if( mDrag)
        {
            mPhysicsWorld->DestroyJoint( mMouseJoint);
            mMouseJoint = NULL;

            mDragBody->SetAwake( true);
        }
        mDrag = false;
    }
}

½Ã¹Ä·¹À̼Ç

b2World¸¦ Step( ) ÇÏ¿© ½Ã¹Ä·¹ÀÌ¼Ç ÇÑ´Ù.
AddOneSprite( )¿¡¼­ bodyÀÇ userData¿¡ Sprite¸¦ ¿¬°áÇÏ°í ÀÖ´Ù.
¿¬°áµÈ ½ºÇÁ¶óÀÌÆ®¸¦ Tick(  )¿¡¼­ À̵¿, ȸÀüÇÑ´Ù.

void HelloWorld::Tick( float dt)
{
    int velocityIIterations = 8;
    int positionIIterations = 3;

    //Step : ¹°¸® ¼¼°è¸¦ ½Ã¹Ä·¹À̼ÇÇÑ´Ù.
    mPhysicsWorld->Step( dt, velocityIIterations, positionIIterations);

    //¸¸µé¾îÁø °´Ã¼¸¸Å­ ·çÇÁ¸¦ µ¹¸®¸é¼­ ¹Ùµð¿¡ ºÙÀÎ ½ºÇÁ¶óÀÌÆ®¸¦ ¿©±â¼­ Á¦¾îÇÑ´Ù.
    for( b2Body *b = mPhysicsWorld->GetBodyList(); b; b = b->GetNext())
    {
        if( b->GetUserData() != NULL)
        {
            CCSprite* spriteData = (CCSprite*)b->GetUserData();
            spriteData->setPosition( ccp( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO));
            spriteData->setRotation( -1 * CC_RADIANS_TO_DEGREES( b->GetAngle()));
        }
    }
}

½Ã¹Ä·¹ÀÌ¼Ç ÇÒ·Á¸é ¸Å ÇÁ·¹ÀÓ ½ÇÇà µÇ¾î¾ß Çϱ⠶§¹®¿¡ schedule( )·Î µî·ÏÇÑ´Ù.

this->schedule( schedule_selector( HelloWorld::Tick));

 

b2MouseJoint bodyA, bodyBody

ccTouchesBegan( )¿¡¼­ ¸¶¿ì½º Á¶ÀÎÆ® »ý¼º½Ã bodyA, bodyB¸¦ ¼³Á¤ÇÏ¿´´Ù.
bodyB´Â µå·¡±× ÇÒ ¹Ùµð¸¦ ´ëÀÔÇÑ´Ù.

 

bodyA¸¦ NULL °ªÀ¸·Î ¼³Á¤Çؼ­ ½ÇÇàÈÄ µå·¡±× Çϸé ÇÁ·Î±×·¥ÀÌ »¸¾î¹ö¸°´Ù.

b2MouseJointDef md;
md.bodyA = NULL;
md.bodyB = mDragBody;

bodyA¸¦ 4°³ÀÇ ¶óÀÎÀ¸·Î ¸·Àº ±×¶ó¿îµå·Î ´ëÀÔÇغ¸ÀÚ.
¸¶¿ì½º·Î ¹Ú½º¸¦ µå·¡±× Çؼ­ â ¹ÛÀ¸·Î ³ª°¡¸é ¹Ú½º°¡ »ç¶óÁø´Ù.
´õ ÀÌ»ó ¹Ú½º¸¦ µå·¡±× ÇÒ ¼ö°¡ ¾ø´Ù.

b2MouseJointDef md;
md.bodyA = mGroundBody;
md.bodyB = mDragBody;

mBody¸¦ bodyA¿¡ ´ëÀÔÇغ¸ÀÚ.
¸¶¿ì½º·Î ¹Ú½º¸¦ µå·¡±× Çؼ­ â ¹ÛÀ¸·Î ³ª°¡µµ ¹Ú½º°¡ ⠿ܺηΠ³ª°¡Áö ¾Ê´Â´Ù.

mBody´Â ÀÌÀü¿¡ ºó Body·Î »ý¼º Çß¾ú´Ù. Á¶ÀÎÆ®¸¦ ÀÌ¿ëÇϱâ À§ÇØ »ç¿ëÇÏ´Â Çã¼ö¾Æºñ ¹ÙµðȤÀº °í½ºÆ® ¹Ùµð°¡?? È®½ÇÇÏ°Ô´Â ¸ð¸£°Ú´Ù.

ÀÌ°ÍÀÌ ¿ì¸®°¡ ¿øÇÏ´Â °á°úÀÌ´Ù.

b2MouseJointDef md;
md.bodyA = mBody;
md.bodyB = mDragBody;

AddOneSprite( ) ÇÔ¼ö¿¡¼­ mBody »ý¼º

¸¶¿ì½º Á¶ÀÎÆ®¿¡ »ç¿ëÇϱâ À§ÇÑ mBody¸¦ »ý¼ºÇÑ´Ù.

//1)¸¶¿ì½º Á¶ÀÎÆ® bodyA ¼³Á¤À» À§ÇÑ Body »ý¼º
//¹ÙµðµðÇÁ·Î À§Ä¡¸¦ ¼³Á¤
b2BodyDef bodyDef1;
bodyDef1.type = b2_staticBody;
bodyDef1.position.Set( 0, 0);
bodyDef1.userData = NULL;

//¿ùµå¿¡ b2BodyDef·Î ¹Ùµð¸¦ ¸¸µç´Ù
mBody = mPhysicsWorld->CreateBody( &bodyDef1);

//¹ÙµðÀÇ ¸Þ½¬¸¦ ¸¸µç´Ù
b2PolygonShape staticBox;
staticBox.SetAsBox( 0.0f, 0.0f);

//fixture·Î ¸Þ½¬¹× ¼Ó¼ºÀ» ¼³Á¤ÇÑ´Ù
b2FixtureDef fixtureDef1;
fixtureDef1.shape = &staticBox;
fixtureDef1.density = 1.0f;

mBody->CreateFixture( &fixtureDef1);

AddOneSprite( ) ÇÔ¼ö¿¡¼­ "A"¹Ú½º »ý¼º

¸¶¿ì½º µå·¡±×¿¡ »ç¿ëµÇ´Â ¹Ú½º °´Ã¼¸¦ »ý¼ºÇÑ´Ù.

userData¿¡ pSprite¸¦ ¿¬°á½ÃŲ´Ù.

CCSprite* pSprite = CCSprite::createWithTexture( mTexture, CCRectMake( 0, 0, 32, 32));
pSprite->setPosition( ccp( 240, 160));
this->addChild( pSprite);

//¹ÙµðµðÇÁ¸¦ ¸¸µé°í ¼Ó¼ºµéÀ» ÁöÁ¤ÇÑ´Ù
b2BodyDef bodyDef2;
bodyDef2.type = b2_dynamicBody;
bodyDef2.position.Set( 240/PTM_RATIO, 160/PTM_RATIO);
bodyDef2.userData = pSprite;

//¿ùµå¿¡ ¹ÙµðµðÇÁÀÇ Á¤º¸·Î ¹Ùµð¸¦ ¸¸µç´Ù.
b2Body* body = mPhysicsWorld->CreateBody( &bodyDef2);

//¹Ùµð ¸Þ½¬ »ý¼º
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox( 0.5f, 0.5f);

b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
fixtureDef.restitution = 0.5f;

body->CreateFixture( &fixtureDef);

 

´Ù¿î·Îµå : Box2DDemo_mouseJoint.zip