CCSprite не действует как физическое тело в COCOS2dx?

У меня есть следующая функция, которая инициализирует сцену в cocos2dxи насколько я знаю, я все сделал правильно. Но мой CCSprite все еще не действует как физическое тело. Он остается неподвижным в центре экрана, в то время как он должен падать и подвергаться воздействию силы тяжести.

Любая помощь будет оценена. Заранее спасибо.

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()) );
}
}
}

1

Решение

Ваш b2World* world является локальной переменной Это означает, что в конце текущей функции она выйдет из области видимости, что означает, что у вас нет возможности вызвать world->Step(..) метод, который вы должны вызывать регулярно (обычно каждый кадр), чтобы улучшить физическое состояние мира. Без шага по миру не будет никакого движения.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]