2010-02-25 4 views
1

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

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); 
+0

Могу ли я попытаться удалить все, что не является существенным из фрагмента кода? Плотность и трение, например, вряд ли имеют какое-то отношение к позиционированию спрайтов. Я, например, неохотно прохожу через большой блок кода, чтобы ответить на простой вопрос. С другой стороны, если вы не уверены, что что-то не влияет на вашу проблему, хорошо оставить ее. Но, пожалуйста, попробуйте сократить ее до минимума. – Felixyz

ответ

2

Я не знаком с Objective-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

Для перемещения спрайта с телом, то Вы должны установить позицию спрайта accotring к телу

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

как это в 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;

Смежные вопросы