2017-07-29 146 views
1

我嘗試使用Actor的InputListener,但它不起作用。我真的不知道爲什麼。我發現了很多關於它的信息,並看到了官方文檔,但沒有一個沒有幫助我。libgdx inputListener不適用於演員

當我觸摸精靈時,我的日誌消息不會顯示。但是,如果我使用全局輸入處理器(對於整個屏幕)它可以正常工作,但我只想爲actor添加一個偵聽器。

我在做什麼錯?

public class GameScreen implements Screen { 
    final Launch launch; 
    Texture texture; 
    Stage stage; 


    public GameScreen(Launch launch) { 
     Gdx.app.setLogLevel(Application.LOG_DEBUG); 
     this.launch = launch; 
     texture = new Texture("hero.png"); 
     stage = new Stage(); 
     Hero hero = new Hero(); 
     hero.addListener(new HeroListener()); 
     stage.addActor(hero); 
     Gdx.input.setInputProcessor(stage); 

    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0, 0, 0.2f, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     stage.draw(); 
     stage.act(Gdx.graphics.getDeltaTime()); 

    } 

    @Override 
    public void resize(int width, int height) { 
    } 

    @Override 
    public void show() { 
    } 

    @Override 
    public void hide() { 
    } 

    @Override 
    public void pause() { 
    } 

    @Override 
    public void resume() { 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
     texture.dispose(); 
    } 

    private class Hero extends Actor { 

     @Override 
     public boolean addListener(EventListener listener) { 
      Gdx.app.debug("MyTag", "my debug message"); 
      return super.addListener(listener); 
     } 

     @Override 
     public void draw(Batch batch, float parentAlpha) { 
      batch.draw(texture, 0, 0, 500, 500); 
     } 
    } 

    private class HeroListener extends InputListener { 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      Gdx.app.debug("MyTag", "touch down"); 
      return super.touchDown(event, x, y, pointer, button); 
     } 

     @Override 
     public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
      Gdx.app.debug("MyTag", "touch up"); 
      super.touchUp(event, x, y, pointer, button); 
     } 
    } 
} 

回答

2

問題是你沒有給你的演員任何大小或位置。 InputListener適用於面向Actor界限的活動。如果您沒有爲您的Actor定義任何尺寸,它將永遠不會收到活動。

Hero hero = new Hero(); 
hero.addListener(new HeroListener()); 

hero.setBounds(0, 0, 500, 500); 

stage.addActor(hero); 

這應該使你的InputListener聽的到着陸/向上事件(0,0),(500,500)的邊界。

此外,它conveninent因爲你可以繪製後使用時,這些邊界:

@Override 
public void draw(Batch batch, float parentAlpha) { 
    batch.draw(texture, getX(), getY(), getWidth(), getHeight()); 
} 
+1

此外,還必須在着陸返回true或潤色不會在它被調用。 – Tenfour04