Как использовать сустав мыши в Android? - PullRequest
0 голосов
/ 29 сентября 2011

Я хочу использовать MouseJoint в Java для Android.Я новичок в box2d и cocos2d.Я не знаю, как использовать мышиный сустав.

1 Ответ

3 голосов
/ 16 октября 2011

я рекомендую вам посмотреть этот учебный пример.Скопируйте его (извините, мне не нравятся неработающие ссылки :)) ...

вы перетаскиваете свое тело с помощью 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());
...