2013-02-12 12 views
7

Ich bin neu in libgdx. Ich habe folgendes Problem. Ich möchte das Zoomen für mein Spiel machen. Dafür habe ich GestureDetectorListener Klasse in meinem GameStage.GestureDetector in libgdx

In GameStage Ich habe den folgenden Code für 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; 
    } 

} 

Auch habe ich gesetzt InputListener für die Schauspieler meiner Bühne, um sie zu ziehen. Das Problem ist, dass, wenn ich InputProcessor zu GestureDetector setze, das Ziehen meiner Schauspieler nicht funktioniert. Ich möchte eine Prise Zoomen mit Kamera und GestureDetector, aber es hat keinen Einfluss auf das Ziehen. Wie kann ich das machen?

Jede Hilfe bitte! Danke.

Antwort

8

CodeNoob auf dem richtigen Weg ist, aber ich denke, man die Dinge anders strukturieren können wollen.

können Sie einen InputMultiplexer verwenden sowohl einen globalen GestureListener und Zuhörer Ihrer Bühne zu installieren:

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

Die andere Sache zu achten gelten die Rückgabewerte auf alle boolean Methoden in Ihrer Eingabe Hörer sind. Jeder, der "wahr" zurückgibt, wird das Ereignis als "behandelt" markieren und der Multiplexer wird das Ereignis nicht an seinen Partner weiterleiten. Auch die Reihenfolge der Eingangsprozessoren in dem Multiplexer macht einen Unterschied (da sie Ereignisse von dem zugrundeliegenden Eingangsprozessor verbergen kann). Die automatisch generierten Stubs, die in Ihrem Beispiel "true" ergeben, "essen" eine Reihe von Ereignissen. Wenn dieser Handler das erste Mal im Multiplexer ist, werden Ereignisse von der Bühne ausgeblendet.

+0

Danke! Du hast recht. "Rückkehr wahr" war das Problem. Und jetzt funktioniert das Ziehen und Zoomen. Aber ich möchte, dass das Zoomen nicht die gesamte Bühne beeinflusst, sondern nur einige Container. Ich denke, ich kann die Kamera nicht benutzen, weil die Kamera für die ganze Bühne eingestellt ist. – Karmar

+0

Was denkst du darüber? Kann ich die Kamera für einen Container einstellen, nicht für die gesamte Bühne? Vielen Dank. – Karmar

+0

Korrekt, wenn Sie die Kamera ändern, ändert sich die Zuordnung Ihres Modellbereichs zum gesamten Bildschirm. Daher ist es nicht ganz richtig, nur einen Container zu zoomen. –

3

Sie benötigen einen InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

Dann erstellen Sie fügen Sie Ihre beiden GestureDetector und InputListener zum InputMultiplexer (myInputMultiplexer.addProcessor()).

und am Ende haben Sie den Multiplexer als Haupt InputProcessor wie folgt festgelegt: Gdx.input.setInputProcessor(myInputMultiplexer)

+0

Ich glaube, die 'InputMultiplexer' nur Zuhörer außerhalb eines' Stage' multiplexen benötigt. Der Fragesteller hat einen Hörer in der Bühne und einen Hörer außerhalb. –

+0

Vielen Dank für Ihre Antworten. Ich habe das Problem mit InputMultiplexer gelöst. – Karmar