我正在box2d开发一个赌场轮盘游戏。如你所知,在这个游戏中,一个球/骰子将在一个圆形的纺车轮。
首先我尝试使用b2circleShape,但它没有用。我的意思是球不是坐在圆形内部。
然后我尝试了b2EdgeShape。但对于b2edgeShape,我需要创建尽可能多的顶点来构建平滑的圆形表面。
无论如何我可以创建不是多边形或不是实心多边形的圆形吗?
如果有任何解决方案,请告诉我
答案 0 :(得分:1)
您可以使用单个机身进行轮盘赌。圆形形状用于“内部”部分,链形状用于“外部”部分。
你可能应该在链状中使用“尖刺”来添加一些东西让球反弹。这是主要的创建功能:
void MainScene::CreateBody()
{
const float32 INNER_RADIUS = 2.50;
const float32 OUTER_RADIUS = 3.0;
const float32 BALL_RADIUS = 0.1;
const uint32 DIVISIONS = 36;
Vec2 position(0,0);
// Create the body.
b2BodyDef bodyDef;
bodyDef.position = position;
bodyDef.type = b2_dynamicBody;
_body = _world->CreateBody(&bodyDef);
assert(_body != NULL);
// Now attach fixtures to the body.
FixtureDef fixtureDef;
fixtureDef.density = 1.0;
fixtureDef.friction = 1.0;
fixtureDef.restitution = 0.9;
fixtureDef.isSensor = false;
// Inner circle.
b2CircleShape circleShape;
circleShape.m_radius = INNER_RADIUS;
fixtureDef.shape = &circleShape;
_body->CreateFixture(&fixtureDef);
// Outer shape.
b2ChainShape chainShape;
vector<Vec2> vertices;
const float32 SPIKE_DEGREE = 2*M_PI/180;
for(int idx = 0; idx < DIVISIONS; idx++)
{
float32 angle = ((M_PI*2)/DIVISIONS)*idx;
float32 xPos, yPos;
xPos = OUTER_RADIUS*cosf(angle-SPIKE_DEGREE);
yPos = OUTER_RADIUS*sinf(angle-SPIKE_DEGREE);
vertices.push_back(Vec2(xPos,yPos));
xPos = OUTER_RADIUS*cosf(angle)*.98;
yPos = OUTER_RADIUS*sinf(angle)*.98;
vertices.push_back(Vec2(xPos,yPos));
xPos = OUTER_RADIUS*cosf(angle+SPIKE_DEGREE);
yPos = OUTER_RADIUS*sinf(angle+SPIKE_DEGREE);
vertices.push_back(Vec2(xPos,yPos));
}
vertices.push_back(vertices[0]);
chainShape.CreateChain(&vertices[0], vertices.size());
fixtureDef.shape = &chainShape;
_body->CreateFixture(&fixtureDef);
// Create some "spikes" for the ball to bounce off of.
// Start it spinning
_body->SetAngularVelocity(M_PI/8);
// NOW create a ball to bounce around inside...
bodyDef.position = Vec2((INNER_RADIUS+OUTER_RADIUS)/2,0);
_ballBody = _world->CreateBody(&bodyDef);
circleShape.m_radius = BALL_RADIUS;
fixtureDef.shape = &circleShape;
_ballBody->CreateFixture(&fixtureDef);
// Give it some velocity so it starts to bounce.
_ballBody->SetLinearVelocity(Vec2(-0.5,0.5));
}
这就是它的样子:
我创建了一个这样的演示。给球一些初始速度,它会稍微反弹,但很快就会卡在外面(离心力?)。为了使这个工作,你可能需要保持激动球使其反弹一段时间,直到你“吸引”到你希望它最终的井/传感器点。
或者你可以在外链内部使用第二个链条夹具,这是“平滑的”。然后在你希望球稳定下来时将其移除。无论如何,你需要使用力来保持球移动一点,直到你希望它能够稳定下来,如果你想让它看起来像一个轮盘赌球。
我将整个项目(Cocos2d-x,c ++)发布到github here。
您可以在我的网站here上找到有关使用Box2d的文章。
这有用吗?