2017-08-11 144 views
2

我有一个小小的麻烦,因为标题说:我无法弄清楚如何向枪指向的方向射击子弹。Box2D - 从旋转枪射击子弹

Picture of problem

这里是短版的代码,我的子弹发射:

b2BodyDef bd; 
bd.type = b2_dynamicBody; 
bd.bullet = true; 
bd.position = gun->GetPosition();//bullet start at the middle of the gun 
m_bullet = m_world->CreateBody(&bd); 
m_bullet->CreateFixture(&fd);   
m_bullet->ApplyLinearImpulseToCenter(??? ,true); 

起初我还以为第一个参数是你想要的身体去朝所以我把gun->GetWorldPoint(b2Vec2(0.0f,-5.0f))(中间的方向枪的枪口)。大错过!过了一会儿,我想我应该尝试把目前的枪的旋转度b2Vec2 vect = b2Vec2(cos(angle * PI/180), sin(angle * PI/180));向量,但然后子弹将不会飞。现在我完全没有想法。请点亮一下。

完整版的代码:

public: 
b2Body* m_bullet = NULL; 
b2Body* gun; 
b2RevoluteJoint* joint1; 
b2FixtureDef fd; 

TestingStuff() 
{ 
    { 
     //body 
     b2CircleShape circle1; 
     circle1.m_radius = 1.6f; 

     fd.shape = &circle1; 
     fd.density = 1.0f; 
     fd.filter.groupIndex = -1;   

     b2BodyDef bd1; 
     bd1.type = b2_staticBody; 
     bd1.position.Set(-5.0f, 9.0f); 
     b2Body* body1 = m_world->CreateBody(&bd1); 
     body1->CreateFixture(&fd); 

     //gun 
     b2PolygonShape box; 
     box.SetAsBox(0.5f, 5.0f); 

     fd.shape = &box; 
     fd.density = 1.0f; 
     fd.filter.groupIndex = -1; 

     b2BodyDef bd2; 
     bd2.type = b2_dynamicBody; 
     bd2.position.Set(-5.0f, 8.0f); 
     gun = m_world->CreateBody(&bd2); 
     gun->CreateFixture(&fd); 

     //joint 
     b2RevoluteJointDef jd1; 
     jd1.Initialize(gun, body1, bd1.position); 
     jd1.enableMotor = true; 
     jd1.maxMotorTorque = 90; 
     jd1.motorSpeed = 180 * DEGTORAD;//DEGTORAD=0.0174532925199432957f 
     joint1 = (b2RevoluteJoint*) m_world->CreateJoint(&jd1); 
    } 

} 

void Keyboard(int key) 
{ 
    switch (key) 
    { 
    case GLFW_KEY_COMMA: 
     if (m_bullet != NULL) 
     { 
      m_world->DestroyBody(m_bullet); 
      m_bullet = NULL; 
     } 

     { 
      //bullet 
      b2CircleShape shape; 
      shape.m_radius = 0.25f; 

      fd.shape = &shape; 
      fd.density = 1; 
      fd.restitution = 0.05f; 
      fd.filter.groupIndex = -1; 

      b2BodyDef bd; 
      bd.type = b2_dynamicBody; 
      bd.bullet = true; 
      bd.position = gun->GetPosition(); 
      m_bullet = m_world->CreateBody(&bd); 
      m_bullet->CreateFixture(&fd); 
      m_bullet->ApplyLinearImpulseToCenter(??? ,true); 
     } 
     break; 
    } 
} 
+1

“'b2Vec2(cos(angle * PI/180),sin(angle))'”,是否是以弧度表示的角度? – genpfault

+0

@genpfault:对于90度,我会把角度= 90.0f – Dant

+0

我想我试图指出,你没有将'sin()'的参数转换为弧度,只有'cos()''秒。你需要做这两件事,否则结果将是毫无意义的,或者至少是Funkytown的单程票。 – genpfault

回答

1

一个良好的睡眠后,我发现一些更多的试验和错误后的溶液。

//bullet 
float degAngle = joint1->GetJointAngle() * RADTODEG + 180; 
b2Vec2 vect = b2Vec2(sin(degAngle* (b2_pi/180)) * 10, cos(degAngle* (b2_pi/180)) * 10); 
m_bullet->ApplyLinearImpulseToCenter(vect ,true); 

的* 10是增加的冲动,让子弹飞得更快,更远,用于测试的缘故,我只是使它10.注意这个代码只是为了测试,如果你想让它更现实的是,增加冲动力,并使子弹朝向枪口而不是朝着它所射击的媒介前进。