2013-11-20 3 views
0

box2d에서 카지노 룰렛 게임을 개발 중입니다. 이 게임에서 알고 있듯이 볼/주사위는 원형의 회전 휠에 있습니다.단색 또는 다각형이 아닌 원형을 만드는 방법 "

처음에는 b2circleShape로 시도했지만 작동하지 않았습니다. 나는 공이 원형 안에 앉아 있지 않다는 것을 의미한다.

그런 다음 b2EdgeShape를 사용해 보았습니다. 하지만 b2edgeShape의 경우 부드러운 원형 표면을 만들 수있는만큼의 정점을 만들어야합니다.

어쨌든 폴리곤이 아니거나 솔리드 폴리곤이 아닌 원 모양을 만들 수 있습니까?

모든 솔루션이있는 경우 나 당신은 룰렛을 위해 하나의 몸을 사용하여이 작업을 수행 할 수 있습니다

+0

휠 림을 만들기 위해 가장자리 또는 더 나은 체인 모양으로 만이 작업을 수행 할 수 있습니다. 100 개의 꼭지점이 필요하면 그렇게하십시오. – LearnCocos2D

+0

당신이 모를 경우를 대비해 : 여러 체인 모양을 연결하여 임의로 복잡한 표면을 형성 할 수 있습니다. 단일 사슬 모양의 정점 수에 국한되지 않습니다. – LearnCocos2D

답변

0

알려 주시기 바랍니다. 그것의 "내부"부분에 원 모양을 사용하고 "외부"부분에 체인 모양을 사용하십시오.

공이 튀어 오르는 것을 추가하려면 체인 모양에 "스파이크"를 사용해야합니다. 여기에 주요 생성 기능은 다음과 같습니다

이는 것처럼 보이는 것입니다
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에 게시했습니다.

내 사이트의 Box2d에 대한 기사는 here에서 찾을 수 있습니다.

이 정보가 도움이 되었습니까?

+0

그것이 스파이크 옆에 붙어있는 이유는 당신이 진짜 룰렛 휠의 경 사진 원뿔 모양과 수직 중력을 설명하지 않았기 때문입니다. 또한 룰렛 휠의 안쪽 가장자리는 부드럽고 스파이크가 없습니다 ...... –

+0

@StevenLu 귀하의 의견에 감사드립니다. 룰렛의 모양을 만드는 원래 요청. 특히 물리학의 완전한 시뮬레이션에 초점을 맞추지 않았습니다. 이 코드는 github에 게시되어 있으며, 모든 사람들에게 가치를 높여 줄 수 있습니다. – FuzzyBunnySlippers