2014-03-12 2 views
1

나는 cocos2dx에서 장면을 초기화하는 다음과 같은 기능을 가지고 있으며 모든 것을 올바르게 수행했다. 하지만 CCSprite은 여전히 ​​Physics 본문 역할을하지 않습니다. 화면 중앙에 고정 된 채로 떨어지지 만 중력에 의해 영향을받습니다.CCSprite가 COCOS2dx에서 물리 구조 본문으로 작동하지 않습니까?

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

void HelloWorld::initPhysics() 
{ 
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); 
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); 
CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); 
//creating the world 
b2Vec2 gravity; 
gravity.Set(0.0f, -20.0f); 
world = new b2World(gravity); 

// Do we want to let bodies sleep? 
world->SetAllowSleeping(true); 

world->SetContinuousPhysics(true); 


CCSprite* bird = CCSprite::create("[email protected]"); 
bird->setScale(2.0); 
bird->setPosition(ccp(visibleSize.width/2, visibleSize.height/2)); 
addChild(bird); 

b2Body *_body; 
// Create ball body and shape 
b2BodyDef ballBodyDef; 
ballBodyDef.type = b2_dynamicBody; 
ballBodyDef.position.Set(screenSize.width,screenSize.height); 
ballBodyDef.userData = bird; 
_body = world->CreateBody(&ballBodyDef); 

b2CircleShape circle; 
circle.m_radius = 26.0/PTM_RATIO; 

b2FixtureDef ballShapeDef; 
ballShapeDef.shape = &circle; 
ballShapeDef.density = 100.0f; 
ballShapeDef.friction = 0.5f; 
ballShapeDef.restitution = 0.7f; 
_body->CreateFixture(&ballShapeDef); 
} 

여기 내 업데이트 기능이 있으며 전역 변수를 전역으로 추가했습니다.

void HelloWorld::update(float dt) 
{ 
int velocityIterations = 8; 
int positionIterations = 1; 

world->Step(dt, velocityIterations, positionIterations); 

//Iterate over the bodies in the physics world 
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) 
{ 
    if (b->GetUserData() != NULL) { 
     //Synchronize the AtlasSprites position and rotation with the corresponding body 
     CCSprite* myActor = (CCSprite*)b->GetUserData(); 
     myActor->setPosition(CCPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO)); 
     myActor->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle())); 
    } 
} 
} 

답변

3

b2World* world은 로컬 변수입니다. 즉, 현재 함수의 끝 부분에서 범위를 벗어날 것이라는 것을 의미합니다. 이는 물리 세계를 발전시키기 위해 정기적으로 (모든 프레임 일반적으로) 호출해야하는 메서드 인 world->Step(..) 메서드를 호출 할 방법이 없음을 나타냅니다. 상태. 세상을 걷지 않고는 움직임이 없습니다.

+0

질문에 내 업데이트 기능을 추가했으며 'b2world world'를 내 전역 변수로 추가했습니다. 그러나 여전히'CCSprite'가 물리학에 반응 할 수 없습니까? 이것에 어떤 도움이 되었습니까? – Harsh

+1

죄송합니다. 'scheduleUpdate();'함수를 호출하는 것을 잊었다! 물리학이 부드럽게 작동합니다! :) 고마워요. – Harsh