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

Cocos2d iphone 如何创建没有实心多边形或非实心圆的圆形状``,cocos2d-iphone,box2d,box2d-iphone,Cocos2d Iphone,Box2d,Box2d Iphone,我正在box2d中开发赌场轮盘赌游戏。正如你所知,在这个游戏中,一个球/骰子将在一个圆形的旋转轮中 首先,我尝试了b2circleShape,但没有成功。我的意思是球不是在圆形里面 然后我试着用了一个边缘造型。但是对于b2edgeShape,我需要创建尽可能多的顶点来构建平滑的圆形曲面 我是否可以创建非多边形或非实心多边形的圆形 如果您有任何解决方案,请让我知道您可以使用轮盘赌轮盘的单个主体来完成此操作。“内部”部分使用圆形,而“外部”部分使用链状 您可能应该在链形状中使用“钉子”来添加球反弹所

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

首先,我尝试了b2circleShape,但没有成功。我的意思是球不是在圆形里面

然后我试着用了一个边缘造型。但是对于b2edgeShape,我需要创建尽可能多的顶点来构建平滑的圆形曲面

我是否可以创建非多边形或非实心多边形的圆形


如果您有任何解决方案,请让我知道

您可以使用轮盘赌轮盘的单个主体来完成此操作。“内部”部分使用圆形,而“外部”部分使用链状

您可能应该在链形状中使用“钉子”来添加球反弹所需的东西。以下是主要的创建功能:

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));
}
void主场景::CreateBody()
{
常数32内半径=2.50;
常量浮动32外半径=3.0;
常量浮球半径=0.1;
const uint32分区=36;
Vec2位置(0,0);
//创建主体。
b2BodyDef-bodyDef;
bodyDef.position=位置;
bodyDef.type=b2_dynamicBody;
_body=_world->CreateBody(&bodyDef);
断言(_body!=NULL);
//现在将固定装置连接到主体。
FixtureDef FixtureDef;
fixtureDef.density=1.0;
fixtureDef.摩擦力=1.0;
fixtureDef.restitution=0.9;
fixtureDef.isSensor=false;
//内圈。
b2圆形圆形;
圆形m_半径=内半径;
fixtureDef.shape=&circleShape;
_body->CreateFixture(&fixtureDef);
//外形。
b2ChainShape-chainShape;
向量顶点;
常数32尖峰度=2*MμPI/180;
对于(int-idx=0;idxCreateFixture(&fixtureDef);
//创造一些“钉子”让球反弹出去。
//开始旋转
_车身->设置角度速度(M_PI/8);
//现在创建一个球在里面反弹。。。
bodyDef.position=Vec2((内半径+外半径)/2,0);
_ballBody=\u world->CreateBody(&bodyDef);
圆形m_半径=球形半径;
fixtureDef.shape=&circleShape;
_ballBody->CreateFixture(&fixtureDef);
//给它一些速度,让它开始反弹。
_球身->设置线性定位(Vec2(-0.5,0.5));
}
这就是它看起来的样子:

我制作了一个演示。给球一些初始速度,它会反弹一点,但很快就会被卡在外面(离心力?)。要使其工作,您可能需要持续刺激球,使其反弹一段时间,直到您使其“吸引”到您希望它结束的井/传感器点

或者你可以在外链的内侧使用第二个链条夹具,这是“光滑的”。然后,当你想让球停下来时,把它取下来。不管怎样,如果你想让球看起来像一个轮盘赌球,你需要使用力来保持球移动一段时间,直到你想让它稳定下来

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

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


这有帮助吗?

您只能使用边缘或更好的链条形状来形成轮辋。如果它需要100个顶点,那就这样吧。如果你不知道的话:你可以将多个链形状链接在一起,形成一个任意复杂的曲面。单链形状中的顶点数量不受限制。它被卡在尖峰旁边的外部原因是,你没有考虑到真正轮盘赌轮的倾斜锥形形状和垂直重力。此外,轮盘赌轮的内侧边缘光滑,没有尖刺……@StevenLu感谢您的反馈。原始请求创建轮盘赌轮的形状。我并不是特别专注于物理的完整模拟。代码发布在github上,欢迎您为其贡献力量,提高其对每个人的价值。。。