2013-02-12 16 views
7

Sono nuovo in libgdx. Ho il seguente problema. Voglio pizzicare lo zoom per il mio gioco. Per questo ho classe GestureDetectorListener nel mio GameStage.GestureDetector in libgdx

In GameStage ho il seguente codice per 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; 
    } 

} 

Inoltre ho impostato InputListener per gli attori della mia fase, al fine di trascinarli. Il problema è che, quando imposto InputProcessor su GestureDetector, il trascinamento dei miei attori non funziona. Voglio avere uno zoom pizzico con la fotocamera e GestureDetector, ma non avrà alcuna influenza sul trascinamento. Come lo posso fare?

Qualsiasi aiuto per favore! Grazie.

risposta

8

CodeNoob è sulla strada giusta, ma penso che si potrebbe voler strutturare diversamente le cose.

È possibile utilizzare un InputMultiplexer per installare sia un ascoltatore globale GestureListener e del palco:

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

L'altra cosa da guardare fuori per è i valori di ritorno su tutte le boolean metodi in vostri ascoltatori di ingresso. Chiunque restituisca "true", contrassegnerà l'evento come "gestito" e il multiplexer non passerà l'evento al suo peer. Inoltre, l'ordine dei processori di input nel multiplexer fa la differenza (in quanto può nascondere gli eventi dal processProcessore sottostante). Quindi, gli stub generati automaticamente che ritornano "veri" nel tuo esempio, "mangeranno" un sacco di eventi. Se questo gestore è il primo nel multiplexer, ciò nasconderà gli eventi dallo stage.

+0

Grazie! Hai ragione. "return true" era il problema. E ora il trascinamento e lo zoom stanno funzionando. Ma voglio che lo zoom non influenzi l'intero palcoscenico, ma su qualche contenitore. Immagino di non poter usare la fotocamera, perché la fotocamera è impostata per l'intero palcoscenico. – Karmar

+0

Cosa ne pensi? Posso impostare la fotocamera per alcuni contenitori, non per l'intera fase? Grazie. – Karmar

+0

Correggere, cambiando la telecamera cambia il modo in cui lo spazio del tuo modello è mappato a tutto lo schermo, quindi non è proprio la cosa giusta per lo zoom di un solo contenitore. –

3

È necessario creare un InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

Poi si aggiunge il sia GestureDetector e InputListener al InputMultiplexer (myInputMultiplexer.addProcessor()).

E alla fine, è necessario impostare il multiplexer come InputProcessor principale in questo modo: Gdx.input.setInputProcessor(myInputMultiplexer)

+0

Credo che "InputMultiplexer" sia necessario solo per i listener multiplex all'esterno di uno "stage". L'interrogante ha un ascoltatore all'interno del palco e un ascoltatore all'esterno. –

+0

Grazie per le vostre risposte. Ho risolto il problema con InputMultiplexer. – Karmar