"A" ¹Ú½º¸¦ ¸¶¿ì½º·Î µå·¡±× ÇÏ¿© ¸¶¿ì½º ¹öÆ°À» ¶¼¸é ¹Ú½º°¡ ¾Æ·¡·Î ¶³¾îÁø´Ù. cocos2d-2.0-x-2.0.4/samples/TestCpp/Resources/Images Æú´õ¿¡¼ blocks.png ÆÄÀÏÀ» º¹»çÇؿ´Ù. ¸¶¿ì½º Á¶ÀÎÆ® º¯¼ö¸¶¿ì½º Á¶ÀÎÆ®¿¡ »ç¿ëµÇ´Â º¯¼ö¸¦ Ãß°¡ÇÏÀÚ. bool mDrag;
b2Body *mDragBody; b2Body *mBody; b2MouseJoint *mMouseJoint;
Á¶ÀÎÆ® »ý¼ºÅÍÄ¡¸¦ Çϸé ÅÍÄ¡½Ã Æ÷ÀÎÅ͸¦ GetBodyAtTab( ) ÇÔ¼ö¿¡ ³Ö¾îÁÖ¸é, ÇØ´ç ¹ÙµðÀÇ TestPoint¸¦ ½ÇÇàÇÑ´Ù. ¹Ùµð°¡ ÀÖÀ¸¸é Á¶ÀÎÆ® 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( ) ÇÏ¿© ½Ã¹Ä·¹ÀÌ¼Ç ÇÑ´Ù. 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, bodyBodyccTouchesBegan( )¿¡¼ ¸¶¿ì½º Á¶ÀÎÆ® »ý¼º½Ã bodyA, 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
|