我正在尝试关闭我身体上的重力。我已经使用了bodyDef。重力秤= 0.0f,但我没有运气。你可以看看下面的代码。请帮助。
b2BodyDef monkey1BodyDef;
monkey1BodyDef.position.Set(0, 200/PTM_RATIO);
monkey1BodyDef.type = b2_dynamicBody;
monkey1BodyDef.userData = monkey1;
monkey1BodyDef.bullet = true;
monkey1BodyDef.gravityScale = 0.0f; //Why doesn't this work I get an error that says no member named 'gravityScale' in 'b2BodyDef'
b2Body *monkey1Body = world->CreateBody(&monkey1BodyDef);
我也遇到过这个问题。经过一番挖掘,我发现稳定的Cocos2D构建不包括最新版本的Box2D,所以b2BodyDef中缺少gravityScale。这就解释了与Box2D文档的差异。
有解决方法,但我选择将我的Box2D更新到2.2.1(目前最新的)。在这样做的过程中,我遇到了以下问题(与解决方案):
-
b2PolygonShape。SetAsEdge方法不再存在。如果你用它来定义屏幕边界,你需要使用类似"myPolygonShape"的东西。为每个屏幕边缘设置(lowerLeftCorner, lowerRightCorner);在"程序员的好东西"上有一个很好的讨论。
-
b2DebugDraw已被b2Draw取代。只要用b2Draw替换掉对b2DebugDraw的调用,你就可以设置了。例如,如果您像我一样使用Cocos2D Box2D模板,则需要替换以下内容:
// Debug Draw functions m_debugDraw = new GLESDebugDraw( PTM_RATIO ); _world->SetDebugDraw(m_debugDraw); uint32 flags = 0; flags += b2DebugDraw::e_shapeBit; flags += b2DebugDraw::e_centerOfMassBit; m_debugDraw->SetFlags(flags);
// Debug Draw functions
m_debugDraw = new GLESDebugDraw( PTM_RATIO );
_world->SetDebugDraw(m_debugDraw);
uint32 flags = 0;
flags += b2Draw::e_shapeBit;
flags += b2Draw::e_centerOfMassBit;
m_debugDraw->SetFlags(flags);
b2Transform对于位置和旋转有不同的属性名。例如,myTransform。位置现在是myTransform。p(但仍然是b2Vec2)。myTransform。R,它被定义为b2Mat22,已经被myTransform取代。q,定义为b2Rot。同样,如果您正在使用Cocos2D Box2D模板,请在GLES-Render.mm中替换以下内容:
void GLESDebugDraw::DrawTransform(const b2Transform& xf) { b2Vec2 p1 = xf.position, p2; const float32 k_axisScale = 0.4f; p2 = p1 + k_axisScale * xf.R.col1; DrawSegment(p1,p2,b2Color(1,0,0)); p2 = p1 + k_axisScale * xf.R.col2; DrawSegment(p1,p2,b2Color(0,1,0)); }
…:
void GLESDebugDraw::DrawTransform(const b2Transform& xf)
{
b2Vec2 p1 = xf.p, p2;
const float32 k_axisScale = 0.4f;
p2 = p1 + k_axisScale * xf.q.GetXAxis();
DrawSegment(p1,p2,b2Color(1,0,0));
p2 = p1 + k_axisScale * xf.q.GetXAxis();
DrawSegment(p1,p2,b2Color(0,1,0));
}
我希望这对你有帮助!
因为'b2BodyDef'中不存在名为'gravityScale'的成员:(
与代码文档已经过时了 改变world的重力定义,因为它是world,有重力,As: 世界是 如果b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);
b2World
body.setGravityScale(0);
不工作,您可以在第二行使用body.setAwake(false);