如何创建没有实心多边形或非实心圆``的圆形

时间:2013-11-20 10:14:59

标签: cocos2d-iphone box2d box2d-iphone

我正在box2d开发一个赌场轮盘游戏。如你所知,在这个游戏中,一个球/骰子将在一个圆形的纺车轮。

首先我尝试使用b2circleShape,但它没有用。我的意思是球不是坐在圆形内部。

然后我尝试了b2EdgeShape。但对于b2edgeShape,我需要创建尽可能多的顶点来构建平滑的圆形表面。

无论如何我可以创建不是多边形或不是实心多边形的圆形吗?

如果有任何解决方案,请告诉我

1 个答案:

答案 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));
}

这就是它的样子:enter image description here

我创建了一个这样的演示。给球一些初始速度,它会稍微反弹,但很快就会卡在外面(离心力?)。为了使这个工作,你可能需要保持激动球使其反弹一段时间,直到你“吸引”到你希望它最终的井/传感器点。

或者你可以在外链内部使用第二个链条夹具,这是“平滑的”。然后在你希望球稳定下来时将其移除。无论如何,你需要使用力来保持球移动一点,直到你希望它能够稳定下来,如果你想让它看起来像一个轮盘赌球。

我将整个项目(Cocos2d-x,c ++)发布到github here

您可以在我的网站here上找到有关使用Box2d的文章。

这有用吗?