2013-02-12 2 views
7

Je suis nouveau dans libgdx. J'ai le problème suivant. Je veux faire un zoom pincement pour mon jeu. Pour cela j'ai GestureDetectorListener classe dans mon GameStage.GestureDetector dans libgdx

En GameStage j'ai le code suivant pour GestureDetector:

OrthographicCamera camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
this.setCamera(camera); 


GestureDetector gestureDetector = new GestureDetector(20, 0.5f, 2, 0.15f, new GestureDetectorListener()); 
Gdx.input.setInputProcessor(gestureDetector); 

class GestureDetectorListener implements GestureListener { 
    float initialScale = 1; 

    @Override 
    public boolean touchDown(float x, float y, int pointer, int button) { 
     initialScale = camera.zoom; 
     return true; 
    } 

    @Override 
    public boolean tap(float x, float y, int count, int button) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean longPress(float x, float y) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean fling(float velocityX, float velocityY, int button) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean pan(float x, float y, float deltaX, float deltaY) { 
     return true; 
    } 

    @Override 
    public boolean zoom(float initialDistance, float distance) { 
     float ratio = initialDistance/distance; 
     camera.zoom = initialScale * ratio; 
     return true; 
    } 

    @Override 
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, 
      Vector2 pointer1, Vector2 pointer2) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

} 

J'ai aussi mis InputListener pour les acteurs de ma scène, afin de les faire glisser. Le problème est que, lorsque je mets InputProcessor à GestureDetector, le glisser de mes Actors ne fonctionne pas. Je veux avoir un pincement avec l'appareil photo et GestureDetector, mais cela n'aura aucune influence sur le glissement. Comment puis je faire ça?

Toute aide s'il vous plaît! Merci.

Répondre

8

CodeNoob est sur la bonne voie, mais je pense que vous pouvez structurer les choses différemment.

Vous pouvez utiliser un InputMultiplexer pour installer à la fois un GestureListener global et auditeur de votre scène:

GestureDetector gd = ... 
Stage myStage = ... 
InputMultiplexer im = new InputMultiplexer(gd, myStage); // Order matters here! 
Gdx.input.setInputProcessor(im); 

L'autre chose à surveiller est les valeurs de retour sur toutes les boolean méthodes de vos auditeurs d'entrée. Tout ce qui renvoie "true" marquera l'événement comme "géré" et le multiplexeur ne transmettra pas l'événement à son homologue. En outre, l'ordre des processeurs d'entrée dans le multiplexeur fait une différence (car il peut cacher des événements du inputProcessor sous-jacent). Ainsi, les bouts générés automatiquement retournant 'vrai' dans votre exemple, vont "manger" un tas d'événements. Si ce gestionnaire est le premier dans le multiplexeur, cela masquera les événements de la scène.

+0

Merci! Tu as raison. "return true" était le problème. Et maintenant, le glisser et le zoom fonctionnent. Mais je veux que le zoom affecte pas toute la scène, mais sur un conteneur. Je suppose que je ne peux pas utiliser d'appareil photo, car la caméra est réglée pour toute la scène. – Karmar

+0

Qu'est-ce que vous en pensez? Puis-je définir l'appareil photo pour un conteneur, pas toute la scène? Merci. – Karmar

+0

Correct, en changeant la caméra change la façon dont votre espace de modèle est mappé à l'écran entier, ce n'est donc pas la bonne chose pour zoomer un seul conteneur. –

3

Vous devez créer un InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

Ensuite, vous ajoutez votre GestureDetector à la fois et InputListener au InputMultiplexer (myInputMultiplexer.addProcessor()).

Et à la fin, vous devez régler le multiplexeur comme le principal InputProcessor comme ceci: Gdx.input.setInputProcessor(myInputMultiplexer)

+0

Je crois que 'InputMultiplexer' est seulement nécessaire pour multiplexer les écouteurs en dehors d'une' Stage'. Le questionneur a un auditeur à l'intérieur de la scène, et un auditeur à l'extérieur. –

+0

Merci pour vos réponses. J'ai résolu le problème avec InputMultiplexer. – Karmar

Questions connexes