AndEngine: проблема с регистрацией и отменой регистрации физического коннектора

Вот проблема: у меня есть фигура, в которой есть и спрайт, и тело. Эту фигуру можно перетаскивать, и при касании события 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;
            }
    }

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


person Egor    schedule 04.05.2011    source источник


Ответы (2)


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

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()); 

        }
person lordraider    schedule 05.05.2011

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

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);
person Community    schedule 21.07.2011