【问题标题】:Box2D dynamic body falling off screenBox2D动态体掉屏
【发布时间】:2012-09-09 21:47:01
【问题描述】:

我基本上有一个矩形物体(如长矛),我有一个接地体。问题是,当长矛击中地面时,它不会弹回,而是落下并离开屏幕。这是我的物理设置:(忽略球参考,它应该被称为矛(矩形))

-(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());
        }        
    }
}

【问题讨论】:

    标签: objective-c ios cocoa-touch physics box2d


    【解决方案1】:

    我在您的代码中没有看到将形状附加到球和矛的任何地方。如果身体没有形状 - 它不会碰撞。

    【讨论】:

      【解决方案2】:

      我认为只有固定装置在 box2d 中发生碰撞。 但是你的矛没有固定装置。 你只创建了fixture def而不是fixture本身。

      在为你的fixtureDef设置restitution后,添加这一行:

      _body->CreateFixture(&ballShapeDef);
      

      然后一切都会好起来的!

      我知道有点晚了..

      【讨论】:

        【解决方案3】:

        我有一段时间没有使用 cocos2d,但我记得您需要创建一个空间并将对象添加到其中,以便它们彼此了解。

        【讨论】:

          【解决方案4】:

          在 Box2D 中,边缘装置不会相互碰撞。使地面或长矛成为多边形。

          【讨论】:

          • 感谢您的回复。我这样做了:b2PolygonShape spearShape; spearShape.SetAsBox(100/PTM_RATIO, 10/PTM_RATIO); b2FixtureDef ballShapeDef; ballShapeDef.shape = &spearShape;但仍然没有骰子。
          • 你怎么知道地面和长矛正在碰撞。至少在给出的代码中,您似乎没有在绘制地面。我不熟悉您使用的框架,我可以假设它会自动为您更新精灵位置,因为您将其设置为 Box2D 主体中的用户数据?我的猜测是你在不同的地方有精灵和身体的位置。
          • 再次感谢您的回复。我已经更新了我的代码以显示所有内容。请看一下。
          猜你喜欢
          • 2012-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多