2010-10-06 2 views
2

У меня есть коробка, создающая с помощью box2d, для которой реституция установлена ​​на ноль. Но когда они падают друг над другом, появляется ошибка bounce.but, я не хочу, чтобы ... я хочу они не двигаются, когда падение над another.it может быть сделано, если я выключить gravity.but я также хочу gravity.here мой кодbox2d: Отключить отскок при столкновении

UIImage *imageOfSnowV1 = [ UIImage imageNamed:[NSString stringWithFormat:@"Object%d.png",currentlySelected]]; 
    CCTexture2D *texOfSnowV1 = [[ [CCTexture2D alloc] initWithImage:imageOfSnowV1 ] autorelease]; 
    CCSprite *sprite = [CCSprite spriteWithTexture:texOfSnowV1 rect:CGRectMake(0, 0, 32, 32)]; 
    [self addChild:sprite]; 
    sprite.position = ccp(p.x, p.y); 
    sprite.tag=[temp intValue]; 


    // Define the dynamic body. 
    //Set up a 1m squared box in the physics world 

    b2BodyDef bodyDef; 
    bodyDef.type = b2_dynamicBody; 

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

    // Define another box shape for our dynamic body. 

    b2PolygonShape dynamicBox; 
    dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box 




    b2MassData massData; 
    massData.mass = 0.1f; 
     bodyS->SetMassData(&massData); 


    // Define the dynamic body fixture. 
    b2FixtureDef fixtureDef; 
    fixtureDef.shape = &dynamicBox; 
    fixtureDef.density = 50.0f; 
    fixtureDef.restitution=0.0f; 
    fixtureDef.friction = 0.01f; 


    bodyS->CreateFixture(&fixtureDef); 

кто может мне помочь?

ответ

0

Как я помню, box2d по умолчанию использует максимальную реституцию сталкивающихся объектов, поэтому даже если у вас есть динамическая реституция тела, установленная на 0, если статическое тело имеет больше 0, то эта реституция будет использоваться для столкновения, вы можете изменить функцию b2MixRestitution для удовлетворения ваших потребностей.

Приветствия, Кшиштоф Заблоцкий

+0

@ Кшиштоф Заблоцкий: я также пытался that..already изменить функцию инлайн .... но не повезло – Rony

+1

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

+0

хахаха ... кажется, каждый думает, что таким же образом ... тоже попробовал это .. – Rony

0

я с той же проблемой в последнее время. Мое решение, просто обнуление координаты Y, когда вы обнаруживаете новое столкновение в вашем слушателе контактов. Он отлично справляется с этим.

0

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

int32 velocityIterations = 10; 
int32 positionIterations = 8; 
world->Step(timeStep, velocityIterations, positionIterations); 
Смежные вопросы