2017-03-07 23 views
0

在我的LibGdx遊戲中,我想在遊戲屏幕中創建一個暫停按鈕。爲此,我創建了一個這樣的舞臺對象。Libgdx在遊戲中彈出屏幕與輸入處理器衝突

Stage stage; 
stage = new Stage(game.viewPort); 

我想有這樣的說法:

Gdx.input.setInputProcessor(stage); 

但另一種說法是已經存在;

Gdx.input.setInputProcessor(inputmultiplexer); 

因此,當我添加一個暫停按鈕,它顯示出來,但按鈕的偵聽器似乎不工作。

private void drawPauseButton() { 

    pauseButton = new ImageButton(new TextureRegionDrawable(pauseTexture), 
      new TextureRegionDrawable(pausePressTexture)); 
    stage.addActor(pauseButton); 

    pauseButton.setPosition(Constants.WORLD_WIDTH,30, Align.bottomRight); 

    pauseButton.addListener(new ActorGestureListener() { 
     @Override 
     public void tap(InputEvent event, float x, float y, int count, int button) { 
      super.tap(event, x, y, count, button); 
      game.setScreen(new PauseScreen(game)); 

      // dispose(); 
     } 
    }); 
} 

如何解決此問題?

輸入多路碼:

public class MyInputProcessor implements InputProcessor,GestureListener { 

public static boolean isTouchDown=false; 
public static boolean isTouchUp=false; 
public static boolean isTap=false; 
public static boolean isLongPress=false; 
public static boolean isFling=false; 
public static boolean isSwipeDown=false; 
public static boolean isSwipeUp=false; 
public static boolean isSwipeLeft=false; 
public static boolean isSwipeRight=false; 
public static boolean isKeyDown=false; 

public static boolean isZoomed=false; 
public static float zoomInitDist=0; 
public static float zoomDist=0; 


public MyInputProcessor() { 
    // TODO Auto-generated constructor stub 
    System.out.println("My Input Processor Created..");  
} 

public InputMultiplexer returnInput() { 
    // TODO Auto-generated method stub 
     InputMultiplexer im = new InputMultiplexer(); 
     GestureDetector gd = new GestureDetector(this); 
     im.addProcessor(gd); 
     im.addProcessor(this); 

    return im; 
} 


@Override 
public boolean tap(float x, float y, int count, int button) { 
    // TODO Auto-generated method stub 

    return false; 
} 

@Override 
public boolean longPress(float x, float y) { 
    // TODO Auto-generated method stub 
    this.isLongPress=true; 
    return false; 
} 

@Override 
public boolean fling(float velocityX, float velocityY, int button) { 
    // TODO Auto-generated method stub 
    if(Math.abs(velocityX)>Math.abs(velocityY)){ 
     if(velocityX>0){ 
       this.isSwipeRight=true; 
     }else{ 
      this.isSwipeLeft=true; 
     } 
    }else{ 
     if(velocityY>0){ 
      this.isSwipeDown=true; 
     }else{         
       this.isSwipeUp=true; 
     } 
    } 
    return false; 
} 

@Override 
public boolean pan(float x, float y, float deltaX, float deltaY) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean panStop(float x, float y, int pointer, int button) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean zoom(float initialDistance, float distance) { 
    // TODO Auto-generated method stub 
    this.isZoomed=true; 
    this.zoomInitDist=initialDistance; 
    this.zoomDist=distance; 
    return false; 
} 

@Override 
public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void pinchStop() { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean keyDown(int keycode) { 
    // TODO Auto-generated method stub 
    this.isKeyDown=true; 
    return true; 
} 

@Override 
public boolean keyUp(int keycode) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean keyTyped(char character) { 
    // TODO Auto-generated method stub 
    return false; 
} 



@Override 
public boolean mouseMoved(int screenX, int screenY) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean scrolled(int amount) { 
    // TODO Auto-generated method stub 
    return false; 
} 


@Override 
public boolean touchDown(int screenX, int screenY, int pointer, int button) { 

    MyInputProcessor.isTouchDown=true; 
    return false; 
} 

@Override 
public boolean touchUp(int screenX, int screenY, int pointer, int button) { 

     MyInputProcessor.isTouchUp=true; 
     return false; 
} 

@Override 
public boolean touchDragged(int screenX, int screenY, int pointer) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean touchDown(float x, float y, int pointer, int button) { 
    // TODO Auto-generated method stub 
    return false; 
} 

裏面gamescreen類的顯示方法:

MyInputProcessor myInputProcessor = new MyInputProcessor(); 
    InputMultiplexer im = myInputProcessor.returnInput(); 
    Gdx.input.setInputProcessor(im); 

回答

1

的InputProcessor委託給其他InputProcessors的有序列表。如果處理器返回true,則表示事件已被處理,則停止委派事件。

階段實現InputProcessor,您可以創建另一個實施並投入Gdx.input

Stage stage=new Stage();    // your 1st InputProcessor 
InputPorcessor processor=new InputPorcessor();  //2nd InputProcessor 
...             // may be 3rd 

InputMultiplexer inputMultiplexer=new InputMultiplexer(); 
inputMultiplexer.addProcessor(stage); 
inputMultiplexer.addProcessor(processor); 

Gdx.input.setInputProcessor(inputMultiplexer); 

編輯

添加您的階段,進入你的多路複用器,以這種方式回報:

public InputMultiplexer returnInput(Stage stage) { 

    InputMultiplexer im = new InputMultiplexer(); 
    GestureDetector gd = new GestureDetector(this); 
    im.addProcessor(stage); 
    im.addProcessor(gd); 
    im.addProcessor(this); 

    return im; 
} 

設置返回值:

MyInputProcessor myInputProcessor = new MyInputProcessor(); 
InputMultiplexer im = myInputProcessor.returnInput(stage); 
Gdx.input.setInputProcessor(im); 
+0

我也爲我的inputMultiplexer添加了代碼.Plz檢查。 – Niranjana

+0

爲什麼要使用Gdx.input.setInputProcessor(stage);通過這個語句只有一個InputProcessor(Stage)分配給Gdx.input – Aryan

+0

如果我沒有使用該語句,爲按鈕定義的監聽器不工作。它只是顯示按鈕圖像。我需要兩個.stage暫停按鈕和inputmultiplexer遊戲play.Dont知道如何使用在一起。這就是問題 – Niranjana