2013-06-29 62 views
0

我和我的一個朋友正在試圖用cocos2dx製作坦克。 我們走了多遠,該坦克是在屏幕上,槍管連接到罐 enter image description here如何用cocos2dx創建坦克

,但現在我們要嘗試到旋轉桶,但什麼也沒發生,上聯是在該中心,其中桶開始圓頂結束。兩個罐和桶是動態的機構和我們使用的是摩擦接頭(見代碼)

// 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)。當然你使用的尺寸可能不同,但方向應該有些類似。

請參見「本地錨」一節在這裏:http://www.iforce2d.net/b2dtut/joints-revolute

+0

圖中的紅色和綠色軸是兩個物體的質量中心,我們已經在該圓頂PyshicsEditor和啓動的設置錨點桶,這就是爲什麼我們在(0,0)上設置localAnchorA和localAnchorB,因爲我們已經設置了PyshicsEditor的定位點 – Bjorn

+0

好的,我明白了。我看起來好像身體已經睡着,但注意力並不是指向下,因爲我期望自然的休息姿勢。無論如何...如果將電機轉速設置爲非零值,該怎麼辦?零意味着關節將像剎車一樣起作用來阻止槍管移動。 – iforce2d

+0

我不認爲電機是選項。我們現在嘗試使用摩擦接頭並使用「旋轉手勢」來旋轉桶。但我們無法獲得旋轉手勢的工作 – Bjorn