Тела не сталкиваются - PullRequest
0 голосов
/ 02 июля 2011

Я установил 2 тела, мир с гравитацией, тиковый метод с шагом, и все тела движутся очень хорошо, и я могу применить силы к ним, гравитация также работает.

, но нетстолкновение.когда body1 падает на землю, он просто выходит из экрана, не ударяется о него и прыгает, как настоящий мяч.когда body1 поражает body2, просто продолжайте движение, поскольку ничего не произошло.

тела имеют форму, у мира есть края, но нет столкновения.что мне здесь не хватает?

вот некоторые функции, которые я вызываю из init:

- (void)addBoxBodyForSprite:(CCSprite *)sprite {

    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    spriteBodyDef.position.Set(sprite.position.x/PTM_RATIO,sprite.position.y/PTM_RATIO);
    spriteBodyDef.userData = sprite;
    spriteBody = world->CreateBody(&spriteBodyDef);

    b2PolygonShape spriteShape;
    spriteShape.SetAsBox(sprite.contentSize.width/PTM_RATIO/2,sprite.contentSize.height/PTM_RATIO/2);
    b2FixtureDef spriteShapeDef;
    spriteShapeDef.shape = &spriteShape;
    spriteShapeDef.density = 10.0;
    spriteShapeDef.isSensor = true;
    spriteBody->CreateFixture(&spriteShapeDef);

}


-(void)worldEdge
{
    CGSize winSize = [CCDirector sharedDirector].winSize;
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0,0);
    b2Body *groundBody = world->CreateBody(&groundBodyDef);
    b2PolygonShape groundBox;
    b2FixtureDef boxShapeDef;
    boxShapeDef.shape = &groundBox;
    groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
    groundBody->CreateFixture(&boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
    groundBody->CreateFixture(&boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
    groundBody->CreateFixture(&boxShapeDef);
    groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0));
    groundBody->CreateFixture(&boxShapeDef);
}




-(void)tick:(ccTime) dt
{


    world->Step(dt,10,10);
    for(b2Body *b=world->GetBodyList(); b; b=b->GetNext()) 
    {
        if(b->GetUserData() !=NULL )
           {
               CCSprite *sprite=(CCSprite *) b->GetUserData();//every b of the world will be update his position
               sprite.position=ccp( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO  ) ;
               sprite.rotation=-1*CC_RADIANS_TO_DEGREES(b->GetAngle());
           }

    }

все движется нормально, но столкновений нет.

1 Ответ

0 голосов
/ 05 января 2014

Конкретная проблема заключается в следующей строке:

spriteShapeDef.isSensor = true;

В box2d, когда вы устанавливаете прибор в качестве датчика, он не будет сталкиваться с другими приборами.

...