2013-02-12 76 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