【问题标题】:libgdx inputListener doesn't work with actorlibgdx inputListener 不适用于演员
【发布时间】:2017-07-29 14:52:06
【问题描述】:

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

【问题讨论】:

    标签: java android libgdx


    【解决方案1】:

    问题是你没有给你的演员任何尺寸或位置。 InputListenerActor 范围内的事件工作。如果您没有为 Actor 定义任何大小,它将永远不会收到事件。

    Hero hero = new Hero();
    hero.addListener(new HeroListener());
    
    hero.setBounds(0, 0, 500, 500);
    
    stage.addActor(hero);
    

    这应该让您的 InputListener 在 (0, 0), (500, 500) 范围内侦听 touchDown/Up 事件。

    另外,它很方便,因为您可以在之后绘制时使用这些边界:

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

    【讨论】:

    • 另外,你必须在 touchDown 中返回 true,否则 touchUp 将不会被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多