Box2D динамическое тело падает с экрана - PullRequest
2 голосов
/ 01 июля 2011

У меня в основном прямоугольный предмет (например, копье), и у меня есть наземное тело.Проблема в том, что когда копье падает на землю, оно не отскакивает назад, оно падает, хотя и за пределы экрана.Вот моя настройка физики: (Игнорировать ссылку на мяч, предположим, она называется копьем (прямоугольник))

-(id) init {

    if( (self=[super init])) {

        CGSize winSize = [CCDirector sharedDirector].winSize;

        self.isAccelerometerEnabled = YES;
        self.isTouchEnabled = YES;

        // Create sprite and add it to the layer
        _ball = [CCSprite spriteWithFile:@"SPEAR.png" rect:CGRectMake(0, 0, 100, 10)];
        _ball.position = ccp(100, 100);
        [self addChild:_ball];

        // Create a world
        b2Vec2 gravity = b2Vec2(0.0f, -20.0f);
        bool doSleep = true;
        _world = new b2World(gravity, doSleep);

        // Create edges around the entire screen
        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);

        // Create ball body and shape
        b2BodyDef ballBodyDef;
        ballBodyDef.type = b2_dynamicBody;
        ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
        ballBodyDef.userData = _ball;
        b2Body *_body = _world->CreateBody(&ballBodyDef);


        b2PolygonShape spearShape;
        spearShape.SetAsBox(100/PTM_RATIO, 10/PTM_RATIO);
        b2FixtureDef ballShapeDef;
        ballShapeDef.shape = &spearShape;


        ballShapeDef.density = 1.0f;
        ballShapeDef.friction = 0.9f;
        ballShapeDef.restitution = 0.89f;

        b2Vec2 force;
        force.Set(_body->GetLinearVelocity().x+5.0f, _body->GetLinearVelocity().y+10.0f);
        _body->SetLinearVelocity(force);

        [self schedule:@selector(tick:)];
    }
    return self;
}

- (void)tick:(ccTime) dt {

    _world->Step(dt, 10, 10);
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {    
        if (b->GetUserData() != NULL) {
            CCSprite *ballData = (CCSprite *)b->GetUserData();
            ballData.position = ccp(b->GetPosition().x * PTM_RATIO,
                                    b->GetPosition().y * PTM_RATIO);
            ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
        }        
    }
}

Ответы [ 4 ]

1 голос
/ 09 сентября 2012

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

после установки восстановления для вас fixtureDef, добавьте эту строку:

_body->CreateFixture(&ballShapeDef);

Тогда все должно быть хорошо!

Немного поздно я знаю ..

1 голос
/ 02 июля 2011

Я не вижу нигде в вашем коде прикрепления фигур к шару и копью. Если тело не имеет формы - оно не столкнется.

0 голосов
/ 01 июля 2011

Кромочные устройства не сталкиваются друг с другом в Box2D. Сделайте либо землю, либо копье полигоном.

0 голосов
/ 01 июля 2011

Я давно не использовал cocos2d, но я помню, что вам нужно было создать пространство и добавить к нему объекты, чтобы они знали друг о друге.

...