я рекомендую вам посмотреть этот учебный пример.Скопируйте его (извините, мне не нравятся неработающие ссылки :)) ...
вы перетаскиваете свое тело с помощью MouseJoint, оно сталкивается с другими телами в мире и применяетсясила к ним.
Box2d - Руководство - http://www.box2d.org/manual.html#_Toc258082974
8.10 Мышиный сустав
Мышиный сустав используется в испытательном стенде дляманипулировать телами с помощью мыши.Он пытается направить точку на теле в направлении текущей позиции курсора.На вращение ограничений нет.
Определение соединения мыши имеет целевую точку, максимальную силу, частоту и коэффициент демпфирования.Целевая точка изначально совпадает с узловой точкой тела.Максимальная сила используется для предотвращения бурных реакций, когда взаимодействуют несколько динамических тел.Вы можете сделать это настолько большим, насколько захотите.Частота и коэффициент демпфирования используются для создания эффекта пружины / демпфера, аналогичного расстоянию.
Многие пользователи пытались адаптировать соединение мыши для игры.Пользователи часто хотят добиться точного позиционирования и мгновенного ответа.Мышиный сустав не очень хорошо работает в этом контексте.Возможно, вы захотите использовать вместо этого кинематические тела.
Итак, начнем ..
- Вы должны создать свой физический мир и хотя бы одно тело в нем.(Изучите PhysicExample, как ..)
- Метод MouseJoint
public MouseJoint createMouseJoint(AnimatedSprite box , float x, float y)
{
final Body boxBody =
this.mPhysicsWorld.getPhysicsConnectorManager().findBodyByShape(box);
Vector2 v = boxBody.getWorldPoint(
new Vector2(x/pixelToMeteRatio, y/pixelToMeteRatio)
);
MouseJointDef mjd = new MouseJointDef();
mjd.bodyA = groundBody;
mjd.bodyB = boxBody;
mjd.dampingRatio = 0.2f;
mjd.frequencyHz = 30;
mjd.maxForce = (float) (200.0f * boxBody.getMass());
mjd.collideConnected = true;
mjd.target.set(v);
return (MouseJoint) this.mPhysicsWorld.createJoint(mjd);
}
- Касание тела
мы должны переопределить наш метод onAreaTouched, чтобы создать точку привязки MouseJoint в позиции касания.
MouseJoint mjActive = null;
private float pixelToMeteRatio = PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
@Override
public boolean onAreaTouched(
final TouchEvent pSceneTouchEvent,
final ITouchArea pTouchArea ,
final float pTouchAreaLocalX,
final float pTouchAreaLocalY )
{
if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
final AnimatedSprite face = (AnimatedSprite)pTouchArea; //The touched body
//If we have a active MouseJoint, we are just moving arround don't create an 2nd one.
if( mjActive == null)
{
Vector2 vector = new Vector2(pTouchAreaLocalX/pixelToMeteRatio,pTouchAreaLocalY/pixelToMeteRatio);
//=====================================
// GROUNDBODY - Used for the MouseJoint
//=====================================
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.position.set(vector);
groundBody = mPhysicsWorld.createBody(groundBodyDef);
//====================================
// CREATE THE MOUSEJOINT
//====================================
mjActive = PhysicsJumpExample.this.createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
}
}});
return true;
}
return false;
}
- Перемещение тела
Мы перемещаем палец по сцене, поэтому мы должны также перемещать MouseJoint.Если мы отпустим палец .. мы должны уничтожить MouseJoint ..
@Override
public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
if(this.mPhysicsWorld != null) {
if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_MOVE) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
if( mjActive != null ){ //If the MJ is active move it ..
// =========================================
// MOVE THE MOUSEJOINT WITH THE FINGER..
// =========================================
Vecotr2 vec = new Vector2(pSceneTouchEvent.getX()/pixelToMeteRatio, pSceneTouchEvent.getY()/pixelToMeteRatio);
mjActive.setTarget(vec);
}
}});
return true;
}
//===========================================
// RELEASE THE FINGER FROM THE SCENE..
//===========================================
if( pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP ||
pSceneTouchEvent.getAction() == MotionEvent.ACTION_CANCEL
) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
if( mjActive != null )
{
//======================================
// DESTROY OUR MOUSEJOINT
//======================================
PhysicsJumpExample.this.mPhysicsWorld.destroyJoint(mjActive);
PhysicsJumpExample.this.mPhysicsWorld.destroyBody(groundBody);
mjActive = null;
}
}});
return true;
}
return false;
}
FYI: чтобы соответствовать вашим потребностям, вы должны поиграть с этими настройками (в методе createMouseJoint)
mjd.dampingRatio = 0.2f;
mjd.frequencyHz = 30;
mjd.maxForce = (float) (200.0f * boxBody.getMass());