在Box2d中以直线抛出物体

Body object Throw in a straightline in Box2d

本文关键字:Box2d      更新时间:2023-10-16

我需要把我的box2d对象扔出屏幕。

例如

…兔子在丛林小径上笔直移动(道路长度约500米)。在此期间,它有一些力量可以运用,比如阿克斯。所以兔子需要把物体向前扔,直到离开屏幕。如果中途有任何可跳跃的物体(如墙和树),抛出的物体需要返回,否则它应该离开屏幕并隐藏。

在触摸事件我调用下面的方法来创建身体和运动我使用setlinear velocity..但它并没有笔直平稳地移动;然后在任何物体之间(如墙和树)。如何反弹(反向旅行)?

[self createbody];

-(void) createbody
{
    freeBodySprite = [CCSprite spriteWithFile:@"blocks.png"];//web_ani_6_1
    //freeBodySprite.position = ccp(100, 300);
    [self addChild:freeBodySprite z:2 tag:6];
    CGPoint startPos = CGPointMake(100, 320/1.25);
    b2BodyDef bodyDef;
    bodyDef.type = b2_staticBody;
    bodyDef.position = [self toMeters:startPos];
    bodyDef.userData = freeBodySprite;
    b2CircleShape shape;
    float radiusInMeters = ((freeBodySprite.contentSize.width * freeBodySprite.scale/PTM_RATIO) * 0.5f);
    shape.m_radius = radiusInMeters;
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &shape;
    fixtureDef.density = 0.07f;
    fixtureDef.friction = 0.1f;
    fixtureDef.restitution = 0.1f;
    b2Fixture *stoneFixture;
    circularObstacleBody = world->CreateBody(&bodyDef);
    stoneFixture = circularObstacleBody->CreateFixture(&fixtureDef);
    freeBody = circularObstacleBody;
}
-(b2Vec2) toMeters:(CGPoint)point
{
    return b2Vec2(point.x / PTM_RATIO, point.y / PTM_RATIO);
}

我有点困惑。如何达到上述要求?

我参考这个链接:- Box2d对象投掷平滑和相同的速度

首先,在你的代码中,你没有显示你的移动代码(你使用线速度)

b2vec2 *move = (30,0);
cart->SetLinearVelocity(move);
上面的代码

将在x轴上以30的速度移动您的box2d身体。当任何物体出现在路中间时。你需要处理下面这些方法

void LevelContactListener::BeginContact(b2Contact* contact)
void LevelContactListener::EndContact(b2Contact* contact)

u将从上面的方法获得fixture。基于碰撞处理,你的box2d身体(玩家力量)和那些道路物体发生碰撞。设置反向功率(-速度)。

你可以将摩擦力设置为0,这样身体就可以很好地从墙壁反弹。

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
b2Body * body = _world->CreateBody(&bodyDef);
b2CircleShape circle;
circle.m_radius = 26.0/PTM_RATIO;
b2FixtureDef ShapeDef;
ShapeDef.shape = &circle;
ShapeDef.density = 1.0f;
ShapeDef.friction = 0.f;
ShapeDef.restitution = 1.0f;
b2Fixture *bodyFixture = body->CreateFixture(&ShapeDef);

要创建墙壁,您需要创建地面主体,例如:

    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0,0);
    _groundBody = _world->CreateBody(&groundBodyDef);
    b2EdgeShape groundBox;
    b2FixtureDef groundBoxDef;
    groundBoxDef.shape = &groundBox;
    groundBox.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
    _bottomFixture = _groundBody->CreateFixture(&groundBoxDef);
    groundBox.Set(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
    _groundBody->CreateFixture(&groundBoxDef);
    groundBox.Set(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 
    winSize.height/PTM_RATIO));
    _groundBody->CreateFixture(&groundBoxDef);
    groundBox.Set(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), 
    b2Vec2(winSize.width/PTM_RATIO, 0));
    _groundBody->CreateFixture(&groundBoxDef);

你可以添加距离连接,将拉回初始位置的对象与其他碰撞器的第一次接触(详见接触监听器)。

我认为有可能有持久的关节连接你的球员与投掷对象。你只需要处理关节极限(距离)和行为(弹簧和阻尼器)。