Как установить положение спрайта в теле box2d? - PullRequest
1 голос
/ 25 февраля 2010

В основном у меня есть 2 полигона для моего тела. Когда я добавляю спрайт для userData, положение текстуры не там, где я хочу. То, что я хочу сделать, это отрегулировать положение текстуры внутри тела. Вот пример кода, где я устанавливаю это:

CCSpriteSheet *sheet = (CCSpriteSheet*) [self getChildByTag:kTagSpriteSheet];
CCSprite *pigeonSprite = [CCSprite spriteWithSpriteSheet:sheet rect:CGRectMake(0,0,40,32)];
[sheet addChild:pigeonSprite z:0 tag:kPigeonSprite];

pigeonSprite.position = ccp( p.x, p.y);

bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = sprite;
b2Body *body = world->CreateBody(&bodyDef);

b2CircleShape dynamicCircle;
dynamicCircle.m_radius = .25f;
dynamicCircle.m_p.Set(0.0f, 1.0f);

        // Define the dynamic body fixture.
b2FixtureDef circleDef;
circleDef.shape = &dynamicCircle;   
circleDef.density = 1.0f;
circleDef.friction = 0.3f;

body->CreateFixture(&circleDef);

b2Vec2 vertices[3];
vertices[0].Set(-0.5f, 0.0f);
vertices[1].Set(0.5f, 0.0f);
vertices[2].Set(0.0f, 1.0f);
b2PolygonShape triangle;
triangle.Set(vertices, 3);

b2FixtureDef triangleDef1;
triangleDef1.shape = ▵ 
triangleDef1.density = 1.0f;
triangleDef1.friction = 0.3f;

body->CreateFixture(&triangleDef1);

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Я не очень хорошо знаком с целью-c, но попробую.

Все, что я вижу, это то, что вы сохраняете указатель на объект спрайта в пользовательских данных тела и затем оставляете его там. Если вы хотите, чтобы положение тела было перенесено в спрайт, вам нужно обновлять его каждый кадр.

В C ++ это будет выглядеть примерно так:

// To be called each time physics should be updated.
void physicsStep(float32 timeStep, int32 velocityIterations, int32 positionIterations) {
    // This is the usual update routine.
    world.Step(timeStep, velocityIterations, positionIterations);
    world.ClearForces();

    // SpriteClass can be replaced with any class you favor.
    // Assume there is a known pointer to the b2Body. Otherwise you'll have to get that,
    // or iterate over all bodies in the world.
    SpriteClass *sprite = (SpriteClass*)body->GetUserData();

    // Once you have the pointer you can transfer all the data.
    sprite.position = body->GetPosition();
    sprite.angle = body->GetAngle();
    // ... and so on
}

Пользовательские данные - это произвольное пространство для хранения в b2Body, и Box2D не имеет представления о том, что вы решили там хранить.

0 голосов
/ 18 ноября 2013

Чтобы переместить спрайт с телом, необходимо установить положение спрайта в соответствии с телом

в вашем методе обновления

как в COCOS2D-X Здесь

sprite = static_cast<CCSprite*>body->GetUserData();
sprite->setPosition(vec2(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO));
sprite->setRotation(-CC_Radian_to_Degree(body->GetAngle));

PTM_RATIO = 32;

...