好吧,永远记住,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));
}
...注意,这个片段包含未定义的“变量”,如 PTM_RATION (如果你不理解它们,请检查基本教程或文档)和视图(包含拖动视图的视图),所以将其视为一个想法,而不是复制并粘贴示例:)。
您创建一个关节(为多点触控应用程序中的每次触摸 - 但您需要跟踪哪个触摸代表该鼠标关节),并将关节的目标移动到其位置。因为它是关节,所以力会适当地施加到 bodyB 上(事实上,鼠标关节会施加很大的力,因此几乎就像即时拖动一样)。
有关关节的更多信息,请查看 f.e.本教程:Box2D 2.1a 教程 – 第 2 部分(关节) http://blog.allanbishop.com/box2d-2-1a-tutorial-part-2-joints/
我希望我的例子是可以理解的,如果有任何其他问题,请随时询问:)。