我最近发现了一个很好的教程,可以使用Box2d for iOS启用物理。
http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/
我只是想知道如何为UIView实现拖放。有人可以提供任何指示吗?谢谢你的时间。
答案 0 :(得分:1)
好吧,请记住,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 Tutorial – Part 2 (Joints)
我希望我的例子是可以理解的,如果有任何其他问题,请不要犹豫:)。