AndEngine: проблема с регистрацией и отменой регистрации физического разъема - PullRequest
1 голос
/ 04 мая 2011

Вот проблема: у меня есть фигура, у которой есть и спрайт, и тело.Эта фигура является перетаскиваемой, и в событии касания Action Down мне нужно отключить тело, чтобы оно не могло столкнуться с другими телами во время перетаскивания.Затем на Action Up тело должно быть подключено к спрайту.Для решения этой проблемы я определил два метода:

protected void connectBody() {
            if (!bodyConnected) {
                    connector = new PhysicsConnector(mSprite, mBody, true, true);
                    mPhysicsWorld.registerPhysicsConnector(connector);
                    bodyConnected = true;
            }
    }

protected void disconnectBody() {
            if (bodyConnected) {
                    if (connector != null) {
                            mPhysicsWorld.unregisterPhysicsConnector(connector);
                    }
                    bodyConnected = false;
            }
    }

Однако это не работает.Когда я перетаскиваю фигуру, она сталкивается с другими фигурами.Может кто-нибудь помочь мне решить это?Заранее большое спасибо.

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Я играл с ним пару дней назад, и это было то, что я сделал, чтобы перетащить объект.

public boolean onAreaTouched( final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea,final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
        if(pSceneTouchEvent.isActionDown()) {
            final AnimatedSprite area = (AnimatedSprite) pTouchArea;
            PhysicsConnector tPhysicsConnector;
            tPhysicsConnector = physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(area);
            physicsWorld.unregisterPhysicsConnector(tPhysicsConnector);
            physicsWorld.destroyBody(tPhysicsConnector.getBody()); 

        }
2 голосов
/ 21 июля 2011

Я наткнулся на эту публикацию, столкнувшись с той же проблемой, и хотя ответ лордрейдеров помог мне встать на правильный путь, я нашел лучшее решение и решил опубликовать его здесь. Решение не требует уничтожения / воссоздания каких-либо тел. Просто сделайте следующее:

if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN){
    physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(self).getBody().setActive(false);
}

if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP){
    physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(self).getBody().setActive(true);
}

Таким образом, вы просто устанавливаете / выключаете активное состояние объектов и можете свободно перемещать объект без физических сил, сражающихся с действием перетаскивания. Вы также можете сбросить / сбросить все текущие силы, приложенные к объекту, в противном случае, когда вы уроните объект, он возобновит действие, в котором он ранее участвовал. Например, если вы подняли мяч, катящийся по склону, когда вы отпустите это, он начал бы двигаться, как будто спускаясь с холма, потому что эти силы были сохранены в состоянии объекта, когда вы отключили физическое тело. Вы можете сделать это так:

physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(self).getBody().setAngularVelocity(0);

physicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(self).getBody().setLinearVelocity(0, 0);
...