我最近发现了一个很好的教程,用于使用 Box2d for iOS 启用物理。
http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/
我只是想知道如何为 UIView 实现拖放。任何人都可以提供任何方向吗?谢谢你的时间。
我最近发现了一个很好的教程,用于使用 Box2d for iOS 启用物理。
http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/
我只是想知道如何为 UIView 实现拖放。任何人都可以提供任何方向吗?谢谢你的时间。
好吧,请始终记住,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(如果您不理解它们,请查看基本教程或文档)和视图(包含拖动视图的视图),因此将其视为一个想法,而不是复制和粘贴示例:)。
您创建一个关节(对于多点触控应用程序中的每次触摸 - 但您需要跟踪哪个触摸代表thich mousejoint),并将关节的目标移动到它的位置。因为是关节,所以对bodyB施加了适当的力(实际上鼠标关节施加的力很大,所以几乎就像瞬间拖动一样)。
有关关节的更多信息,请查看本教程:Box2D 2.1a 教程 - 第 2 部分(关节)
我希望我的例子是可以理解的,如果有任何其他问题,请不要犹豫:)。