在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);
你可以添加距离连接,将拉回初始位置的对象与其他碰撞器的第一次接触(详见接触监听器)。
我认为有可能有持久的关节连接你的球员与投掷对象。你只需要处理关节极限(距离)和行为(弹簧和阻尼器)。
相关文章:
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- 使用 vcpkg 安装 box2d
- 如何在Cmake中正确查找头路径,以便在我的项目中构建Box2D
- Box2D Contact Listener碰撞仅间歇性工作
- Box2D OpenGl Error
- Box2D 断言失败:kNormal > 1.19209289550781250000e-7F
- Box2D (C++) 三角形故障区域断言
- Box2D 如何处理位置和坐标?
- Box2D ContactListener未检测到碰撞
- SFML 和 Box2D SetUserData 无法将参数从 const char [4] 转换为 void *
- Box2D不寻常的错误.为什么 0阻止错误
- 为什么还要使用运动型身体?Box2D
- Box2D-从身体中获取固定装置的宽度,或者我什至应该尝试
- Box2D,联系听众:切勿调用BeginContact
- box2d -c 中删除主体
- 链接到由Emscripten编译的Box2D链接时的未定义符号
- 焊接体的Box2d中心质量
- 销毁 Box2D 主体 - 读取访问冲突错误
- 在Codelite IDE中使用Box2D
- Box2D-我应该多久在窗户循环中使用台阶