2013-06-29 1 views
0

Me와 mine의 친구가 cocos2dx로 탱크를 만들려고합니다. 우리가 지금까지 탱크가 화면에 배럴이 탱크 enter image description herecocos2dx로 탱크를 만드는 법

하지만 지금 우리는 회전에 배럴을 시도하고 싶지만 아무것도 발생하지 않습니다에 부착되어있다가, 공동의 중앙에 위치를 배럴당 시작 드 돔 끝납니다. 탱크 및 통 모두 동적 몸이며 우리는

// Create sprite and add it to the layer 
CCSprite *tank = CCSprite::create(); 
//tank->initWithFile("../Resources/tanks/001/tank.png"); 
tank->setPosition(pos); 
tank->setTag(1); 
this->addChild(tank); 

// Create ball body 
b2BodyDef tankBodyDef; 
tankBodyDef.type = b2_dynamicBody; 
tankBodyDef.position = toMeters(&pos); 
tankBodyDef.userData = tank; 

tankBody = _world->CreateBody(&tankBodyDef); 

// Create shape definition and add body 
shapeCache->addFixturesToBody(tankBody, "001/tank"); 


pos = CCPointMake(580, 450); 

// Create sprite and add it to the layer 
CCSprite *barrel = CCSprite::create(); 
//barrel->initWithFile("Tanks/001/barrel.png"); 
barrel->setPosition(pos); 
barrel->setTag(2); 
this->addChild(barrel); 

// Create ball body 
b2BodyDef barrelBodyDef; 
barrelBodyDef.type = b2_dynamicBody; 
barrelBodyDef.position = toMeters(&pos); 
barrelBodyDef.userData = barrel; 

barrelBody = _world->CreateBody(&barrelBodyDef); 
    tankBarrelAnchor = CreateRevoluteJoint(tankBody, barrelBody, -85.f, 180.f, 2000000.f, 0.f, true, false); 
    tankBarrelAnchor->localAnchorA = b2Vec2(0, 0); 
    tankBarrelAnchor->localAnchorB = b2Vec2(0, 0); 
    tankBarrelAnchor->referenceAngle = 0; 
    joint = (b2RevoluteJoint*)_world->CreateJoint(tankBarrelAnchor); 

b2RevoluteJointDef* Level::CreateRevoluteJoint(b2Body* A, b2Body* B, float lowerAngle, float upperAngle, float maxMotorTorque, float motorSpeed, boolean enableMotor, boolean collideConnect){ 
     b2RevoluteJointDef *revoluteJointDef = new b2RevoluteJointDef(); 
     revoluteJointDef->bodyA = A; 
     revoluteJointDef->bodyB = B; 
     revoluteJointDef->collideConnected = collideConnect; 
     revoluteJointDef->lowerAngle = CC_DEGREES_TO_RADIANS(lowerAngle); 
     revoluteJointDef->upperAngle = CC_DEGREES_TO_RADIANS(upperAngle); 
     revoluteJointDef->enableLimit = true; 
     revoluteJointDef->enableMotor = enableMotor; 
     revoluteJointDef->maxMotorTorque = maxMotorTorque; 
     revoluteJointDef->motorSpeed = CC_DEGREES_TO_RADIANS(motorSpeed); //1 turn per second counter-clockwise 
     return revoluteJointDef; 
    } 

답변

0

나는 문제가 앵커 위치가 올바르지 않은 것을 생각 (코드 참조) 마찰 조인트를 사용하고 있습니다. 이 설정 :

tankBarrelAnchor->localAnchorA = b2Vec2(0, 0); 
tankBarrelAnchor->localAnchorB = b2Vec2(0, 0); 

은 ... 당신이 당신의 스크린 샷에서 볼 수있는 두 빨간색과 녹색 축에 앵커를 둘 것, 그리고 함께 그 두 점을 끌어하려고합니다. 디버그 드로우에서 조인트 디스플레이를 켜는 것이 더 분명합니다.

각 앵커의 관점에서 앵커를 로컬 좌표로 지정해야합니다. 예를 들어 탱크 본체의 관점에서 볼 때 회전 지점은 (1,2)와 같고 배럴 본체의 관점에서는 (-1,0)처럼 보입니다. 물론 사용하는 치수는 다를 수 있지만 방향이 다소 비슷해야합니다.

여기에 "로컬 앵커"섹션을 참조하십시오 :

+0

그림에서 빨간색과 녹색 축 http://www.iforce2d.net/b2dtut/joints-revolute 두 물체의 질량 중심됩니다, 우리는 돔에서 PyshicsEditor과 시작의와 앵커 포인트를 설정 한 왜냐하면 우리가 PyshicsEditor로 앵커 포인트를 설정했기 때문입니다. – Bjorn

+0

괜찮습니다. 몸이 잠 들어있는 것처럼 보이는 방식으로 정신이 산만했으나 자연적인 휴식 자세가 기대 되듯이 배럴이 아래를 향하지 않습니다. 어쨌든 ... 모터 속도를 0이 아닌 값으로 설정하면 어떻습니까? 0은 조인트가 배럴이 움직이는 것을 멈추게하는 브레이크처럼 작동한다는 것을 의미합니다. – iforce2d

+0

나는 모터가 옵션이라고 생각하지 않는다. 우리는 이제 마찰 조인트를 사용하고 배럴을 회전시키기 위해 '회전 제스처'를 사용하려고합니다. 하지만 우리는 회전 동작을 작동시키지 않습니다. – Bjorn