2013-02-12 81 views
7

我是libgdx中的新手。我有以下問題。我想爲我的比賽做縮放。爲此,我在GameStage中有GestureDetectorListener班。libgdx中的手勢檢測器

GameStage我有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; 
    } 

} 

而且我已經設置InputListener爲我的舞臺的演員,才能拖動。問題是,當我將InputProcessor設置爲GestureDetector時,我的Actors拖動不起作用。我想用相機縮放,GestureDetector,但它不會對拖動造成影響。我怎樣才能做到這一點?

請任何幫助! 謝謝。

回答

8

CodeNoob是在正確的道路上,但我想你可能希望以不同結構的東西。

您可以使用InputMultiplexer同時安裝全球GestureListener和你的舞臺的聽衆:

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

其他的事情需要注意的是所有在你輸入的聽衆的boolean方法的返回值。任何返回「true」的事件都會將事件標記爲「已處理」,並且多路複用器不會將事件傳遞給其對等設備。此外,多路複用器中輸入處理器的順序也有所不同(因爲它可能隱藏底層inputProcessor的事件)。所以,在你的例子中返回「true」的自動生成的存根將會「吃」一堆事件。如果這個處理程序是多路複用器中的第一個,它將隱藏舞臺上的事件。

+0

謝謝!你是對的。 「返回真實」是問題所在。現在拖動和縮放工作。但我希望縮放不是影響整個舞臺,而是影響一些容器。我想我不能使用相機,因爲相機設置爲整個舞臺。 – Karmar 2013-02-13 08:13:18

+0

你在想什麼?我可以將相機設置爲某個容器,而不是整個舞臺嗎?謝謝。 – Karmar 2013-02-13 08:21:39

+0

正確,改變相機改變了你的模型空間映射到整個屏幕的方式,所以它不太適合放大一個容器。 – 2013-02-13 16:56:06

3

你需要創建一個InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

然後你你都GestureDetector和InputListener添加到InputMultiplexer(myInputMultiplexer.addProcessor())。

,並在年底,你必須設置多路複用器,這樣主要InputProcessor:Gdx.input.setInputProcessor(myInputMultiplexer)

+0

我相信'InputMultiplexer'只需要在'Stage'之外複用偵聽器。提問者在舞臺上有一個聽衆,在外面有一個聽衆。 – 2013-02-12 14:06:51

+0

謝謝你的回答。我用InputMultiplexer解決了這個問題。 – Karmar 2013-02-13 08:12:57