libgdx inputListener不适用于演员

问题描述:

我尝试使用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); 
     } 
    } 
} 

问题是你没有给你的演员任何大小或位置。 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