2013-02-12 3 views
7

libgdx에서 새로 생겼습니다. 나는 다음과 같은 문제가있다. 내 게임을 대충 확대하고 싶습니다. 그 때문에 내 GameStageGestureDetectorListener 클래스가 있습니다. libgdx의 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을 설정 한 : GameStage에서

나는 GestureDetector에 대한 다음과 같은 코드가 있습니다. 문제는 InputProcessorGestureDetector으로 설정하면 액터 드래그가 작동하지 않는다는 것입니다. 카메라를 사용하여 핀치 확대/축소 및 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

고마워요! 당신 말이 맞아요. "return true"가 문제였습니다. 이제 드래그하고 확대/축소가 작동합니다. 그러나 줌이 전체 스테이지가 아니라 일부 컨테이너에 영향을 주길 바랍니다. 나는 카메라를 사용할 수 없다고 생각한다. 카메라가 전체 무대에 설정되어 있기 때문이다. – Karmar

+0

그것에 대해 어떻게 생각하세요? 전체 무대가 아닌 일부 컨테이너 용으로 카메라를 설정할 수 있습니까? 감사. – Karmar

+0

맞습니다. 카메라를 변경하면 모델 공간이 전체 화면에 매핑되는 방식이 바뀌므로 하나의 컨테이너 만 확대하는 것은 적절하지 않습니다. –

3

당신은 그런 다음 InputMultiplexer (myInputMultiplexer.addProcessor())에 GestureDetector 및 InputListener 모두를 추가 InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

을 작성해야합니다.

그리고 끝에서

, 당신은이 같은 주요 InputProcessor으로 멀티플렉서를 설정해야합니다 : Gdx.input.setInputProcessor(myInputMultiplexer)

+0

'InputMultiplexer'는'Stage' 밖에서 청취자를 다중화하기 위해서만 필요하다고 생각합니다. 질문자는 무대 안쪽에 청취자 한 명을 가지고 있으며 한 청취자는 밖에 있습니다. –

+0

답변 해 주셔서 감사합니다. 나는 InputMultiplexer로이 문제를 해결했다. – Karmar