我创建了一个box2d主体,它连接到第二个带有焊接接头的box2d主体。与身体相关联的第一个box2d精灵呈棒状。第二个box2d体是抛出第一个box2d体的人。第一个box2d体初始化为具有指定密度,摩擦力和恢复原状的多边形形状。根据游戏状态,第一个box2d正文可能会更改为不同的精灵(但box2d正文保持不变)。新的精灵是一个盒子的形状。当改变到新的精灵时,原始的焊接接头被破坏并且新的精灵被替换。创建新的焊接接头以将box2d主体重新连接到第二box2d主体(即,重新连接到人)。另外,第一个体的box2d夹具被改变为具有更多的摩擦力和更少的恢复,因为我不希望第二种类型的精灵像第一种类型的精灵那样反弹和滑动。
在每种情况下,当我以编程方式断开焊接接头时,我有一种冲动,我应用于第一个box2d主体。使用第二个精灵(盒子),施加脉冲后行进的距离远远超过第一个精灵(棒)。我不明白为什么会有这样的差异,因为我只是改变了被抛出的“外观”。密度和质量是相同的。当我单步执行代码时,box2d结构中的线速度似乎相同。物理学中显然有些东西我不明白。
如果给出相同的冲动,我的目标是让两种精灵类型都移动到同一位置。是否可以启用每个sprite类型的行为相同?请提供一些指导以实现我的目标。
下面是删除旧精灵并重新附加新精灵的代码(注意“attachedBody”是之前使用旧精灵定义的box2D主体):
b2WeldJoint *myJoint;
// break the existing joint
// Destroy joint so the attachedBody will be free from the player
world->DestroyJoint(myJoint);
// Substitute the existing sprite with a new sprite. Also transform the position of the new sprite so that it is still touching the players hand
Box2DSprite *sprite = (Box2DSprite *) attachedBody->GetUserData();
[sprite setDisplayFrame: [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: @"newSprite.png"] ];
attachedBody->SetTransform(teamA.foreArmBody->GetWorldPoint(b2Vec2(65.0/100.0, -25.0/100.0)), -40.0f); // move new sprite to the players hand. Rotate the angle by 40.
// Make this new sprite stick when it lands
attachedBody->GetFixtureList()->SetFriction(8.0);
attachedBody->GetFixtureList()->SetRestitution(0.0);
// Create a new weld joint with the players hand and the new sprite
b2WeldJointDef weldJointDef;
weldJointDef.Initialize(attachedBody, teamA.foreArmBody, teamA.foreArmBody->GetWorldPoint(b2Vec2(6.0/100.0, -10.0/100.0)));
weldJointDef.collideConnected = false;
myJoint = (b2WeldJoint*)world->CreateJoint(&weldJointDef);
答案 0 :(得分:0)
在深入挖掘回答上述评论之后,我发现我并不是在比较苹果和橘子。我的问题是,在一种情况下,当我施加脉冲时,第一个身体(棒)的速度为零。当我用新的精灵替换第一个体的精灵然后给它相同的脉冲时,身体的初始速度非零。因此它走得更远。我的解决方案很简单。我只需要在施加脉冲之前将速度设置为零,以使两个不同的精灵行进相同的距离。例如:
attachedBody->SetLinearVelocity(b2Vec2(0,0));