好吧,请始终记住,Box2D 中的所有内容都必须强制移动(好吧,可以直接设置位置,但如果您想要平滑的物理移动,这将无法解决问题)。
因此,如果您想将某个身体相应地移动到另一个身体(通过触摸移动身体),关节是实现这一目标的最佳方式,猜猜看,有一种称为 MouseJoint 的关节类型,它非常适合这种情况(也可以多点触控使用)。
b2MouseJointDef def;
def.bodyA=/*background_body*/;
def.bodyB=/*body of dragged view*/;
def.frequencyHz=60.0f;
def.dampingRatio=0.0f;
def.maxForce=x * def.bodyB->GetMass(); //i use this for same applied force depending on mass
def.collideConnected=YES;
def.target.Set(loc.x/PTM_RATIO, (self.bounds.size.height - loc.y)/PTM_RATIO);
bwMouseJoint joint=b2World->CreateJoint(def);
然后设置鼠标关节的位置(目标)
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
CGPoint loc=[[touches anyObject] locationInView:view];
joint->SetTarget(b2Vec2(loc.x/PTM_RATIO,(view.bounds.size.height-loc.y)/PTM_RATIO));
}
...请注意,此 snipper 包含未定义的“变量”,例如 PTM_RATION(如果您不理解它们,请查看基本教程或文档)和视图(包含拖动视图的视图),因此将其视为想法,而不是复制和粘贴示例:)。
您创建一个关节(对于多点触控应用程序中的每次触摸 - 但您需要跟踪代表鼠标关节的触摸),并将关节的目标移动到它的位置。因为是关节,所以对bodyB施加了适当的力(实际上鼠标关节施加的力很大,所以几乎就像是瞬间拖动一样)。
有关关节的更多信息,请查看 f.e.本教程:Box2D 2.1a Tutorial – Part 2 (Joints)
我希望我的例子是可以理解的,如果有任何其他问题,请不要犹豫:)。