Box2D
2D ¹°¸®¿£ÁøÀÎ Box2D¿¡ ´ëÇؼ ¾Ë¾Æº¸ÀÚ. ´Ù¿î·Îµå À§Ä¡´Â ´ÙÀ½°ú °°´Ù. Box2D ¿£Áø ¼Ò½º : http://code.google.com/p/box2d/ Box2DÀÇ ¶óÀÌÆ® ¹öÀü : http://box2d.googlecode.com/files/Box2D_Lite.zip ÅÍÄ¡Çϸé ÅÍÄ¡ÇÑ À§Ä¡¿¡ Ŭ·ÎÁî ½ºÇÁ¶óÀÌÆ®°¡ Çϳª¾¿ ¶³¾îÁø´Ù. ¹°¸® ¿ë¾îRigidBody : °Ã¼ constraint : Á¦¾à contract constraint : °è¾àÀû Á¦¾à fixture : °íÁ¤¹° joint : °üÀý joint limit : °üÀý ÇÑ°èÄ¡ joint motor : °üÀý ¸ðÅÍ world : ¼¼°è solver : ÇØ°á»ç continuous collision : ¿¬¼ÓÀûÀÎ Ãæµ¹ restitution : ¹Ý¹ß·Â ¾ÀÀÇ Çì´õ ÆÄÀÏ ,box2D ¹°¸®¿£ÁøÀ» »ç¿ëÇÑ´Ù¸é Çì´õ ÆÄÀÏ¿¡ ²À Ãß°¡ µÇ¾î¾ß ÇÒ »çÇ×ÀÌ´Ù. #include "Box2D/Box2D.h" //box2D Çì´õ ÆÄÀÏ #define PTM_RATIO 32 //1¹ÌÅÍ´ç Çȼ¿ÀÇ ¼ö b2World *mPhysicsWorld //¹°¸® ¿ùµå header
#include "cocos2d.h"
#include "Box2D/Box2D.h" #include "SimpleAudioEngine.h" #define PTM_RATIO 32 using namespace cocos2d; class HelloWorld : public cocos2d::CCLayerColor { public: //ÄÚµå »ý·« virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent); void createPhysicsWorld(); void UpdatePhysics( float dt); void addCircleRigidBody( const CCPoint& pos); private: CCSize mWindowSize; CCTexture2D *mTexture; b2World *mPhysicsWorld; };
¿ùµå »ý¼º¹°¸® ½Ã¹Ä·¹ÀÌ¼Ç °ø°£À» ¸¸µé±â À§ÇØ ¿ùµå( b2World )¸¦ »ý¼ºÇÑ´Ù. ¿ùµå »ý¼º
void HelloWorld::createPhysicsWorld()
{ //Áß·Â ¼³Á¤ b2Vec2 gravity = b2Vec2( 0.0f, -9.8f); //¿ùµå »ý¼º mPhysicsWorld = new b2World( gravity); //¹°Ã¼°¡ Á¤Áö ÇßÀ»¶§ ¿¬»êÀ» ¾ÈÇÔ mPhysicsWorld->SetAllowSleeping( true); //Áö¼ÓÀûÀ¸·Î Ãæµ¹ °¨Áö mPhysicsWorld->SetContinuousPhysics( true); } ±×¶ó¿îµå RigidnBody »ý¼º½ºÅ©¸° ¿µ¿ªÀ¸·Î 4°³ÀÇ ¶óÀÎÀ» ¸¸µé¾î ±×¶ó¿îµå RigidBody¸¦ ¸¸µç´Ù. ¸®Áöµå¹Ùµð »ý¼ºÀº 4´Ü°è¸¦ °ÅÄ£´Ù.
b2EdgeShape´Â : µÎÁ¡À» Áö³ª´Â Á÷¼±À» ¸¸µç´Ù. Hellow::int( )¿¡ ´ÙÀ½°ú °°ÀÌ Ãß°¡ ÇÑ´Ù. this->setTouchEnabled(true); mWindowSize = CCDirector::sharedDirector()->getWinSize(); //box2d ¸®Áöµå¹Ùµð¿ë ÅؽºÃÄ createPhysicsWorld(); CreateGround( mPhysicsWorld, mWindowSize);
CreateGround
void CreateGround( b2World *pWorld, const CCSize &size) //2. BodyDef·Î Body »ý¼º
Circle RigidBody »ý¼º¿òÁ÷ÀÌ´Â RigidBody À̹ǷΠµ¿ÀûÀÎ ¹ÙµðÇüÀ¸·Î ¼±¾ð ÇØÁØ´Ù. bodyDef.type = b2_dynamicBody b2CircleShape·Î Ãæµ¹ ¼ÎÀÌÇÁ¸¦ »ý¼ºÇÏ¿´´Ù. À¯Àú µ¥ÀÌÅÍ( userData )¸¦ ¼³Á¤ÇÏ¿© ½Ã¹Ä·¹ÀÌ¼Ç ÇÒ ¶§, ½ºÇÁ¶óÀÌÆ®¸¦ ÂüÁ¶ ÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿´´Ù. void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) addCircleRigidBody( touchPoint); ÅÍÄ¡ ÇÑ À§Ä¡¿¡ Ŭ·ÎÁî ¿øÇü ¹öÆ°ÀÌ Ãß°¡µÈ´Ù. addCircleRigidBody
void HelloWorld::addCircleRigidBody( const CCPoint& pos)
{ //0. ½ºÇÁ¶óÀÌÆ® »ý¼º CCSprite *pSprite = CCSprite::createWithTexture( mTexture, CCRectMake( 0, 0, 37, 37)); pSprite->setPosition( pos); this->addChild( pSprite); //1. BodyDef·Î ÁÂÇ¥µîÀ» ¼³Á¤ b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set( pos.x / PTM_RATIO, pos.y / PTM_RATIO); bodyDef.userData = pSprite; //2. BodyDef·Î Body »ý¼º b2Body *body = mPhysicsWorld->CreateBody( &bodyDef); //3. FixtureDef·Î Shape »ý¼º, Ư¼º ¼³Á¤ b2CircleShape circleShape; b2FixtureDef fixtureDef; fixtureDef.shape = &circleShape; circleShape.m_radius = 0.55f; fixtureDef.density = 1.0f; //¹Ðµµ fixtureDef.friction = 0.2f; //¸¶Âû·Â 0 ~ 1 fixtureDef.restitution = 0.7f; //¹Ý¹ß·Â //4. Body¿¡ Fixture µî·Ï body->CreateFixture( &fixtureDef); }
½Ã¹Ä·¹À̼Çb2World::step¿¡¼ ¹°¸® ½Ã¹Ä·¹À̼ÇÀ» ÇÑ´Ù. box2d´Â ÀûºÐ±â(integrator) ¾Ë°í¸®ÁòÀ» »ç¿ëÇؼ °è»êÇÑ´Ù. box2D¿¡¼ 1´ÜÀ§´Â 1m·Î ¼³Á¤ÇÏ°í ÄÚÄÚ½º 2D¿¡¼´Â 32¸¦ 1m ¼³Á¤ÇÏ¿´´Ù. #define PTM_RATIO 32 ÄÚÄÚ½º 2D´Â ½Ã°è ¹æÇâÀ¸·Î ȸÀüÇÑ´Ù. Box2D´Â ¹Ý½Ã°è ¹æÇâÀ¸·Î ȸÀüÇϱ⠶§¹®¿¡ -1À» °öÇÔ( È®½ÇÇÏÁö ¾Ê°í ÃßÃøÀÓ) this->schedule( schedule_selector( HelloWorld::UpdatePhysics)) ½ºÄÉÁ층À» ÅëÇÏ¿© ¹°¸® ¾÷µ¥ÀÌÆ®°¡ µÇµµ·Ï ÇÏ¿´´Ù. Simulation
void HelloWorld::UpdatePhysics( float dt)
{ int velocityInerations = 8; int positionInerations = 3; //½Ã¹Ä·¹ÀÌ¼Ç mPhysicsWorld->Step( dt, velocityInerations, positionInerations); for(b2Body *body = mPhysicsWorld->GetBodyList(); body; body = body->GetNext()) { if( body->GetUserData() != NULL) { CCSprite *spriteData = (CCSprite*)body->GetUserData(); spriteData->setPosition( ccp( body->GetPosition().x * PTM_RATIO, body->GetPosition().y * PTM_RATIO) ); spriteData->setRotation( -1 * CC_RADIANS_TO_DEGREES( body->GetAngle()) ); } } } ´Ù¿î·Îµå : HelloWorldScene.h HelloWorldScene.cpp
|