【问题标题】:GestureDetector and InputListener in libgdxlibgdx 中的 GestureDetector 和 InputListener
【发布时间】:2013-09-01 14:53:37
【问题描述】:

我是 libgdx 的新手,我想要在这里实现的是我希望 GestureDetector 与 InputListener 同时工作。我在左侧有两个按钮,即使我同时开始滑动(多点触控),我也需要它们保持反应。我使用了 InputMultiplexer,但它不能按照我需要的方式工作。我检查了 InputListener 和 GestureDetector 的所有返回值,我需要的所有内容都返回 true,GestureInputListener 也是一个实现 GestureDetector.GestureListener 的类。我只用过一扔。 GestureInputListener 和 InputListener 都可以工作,但不能同时工作。你能帮我解决这个问题吗?链接,想法。谢谢。代码如下:

inputMultiplexer.addProcessor(stage);
inputMultiplexer.addProcessor(new GestureDetector(gestureInputListener));
Gdx.input.setInputProcessor(inputMultiplexer); 

【问题讨论】:

    标签: java android libgdx gesturedetector


    【解决方案1】:

    在使用以下任何类(GestureDetector 或 InputProcessor)时,如果您从其函数返回 true,则它不会检查附加到您的游戏的任何其他处理器。..

    在您的代码中,您首先添加了阶段,然后添加了手势检测器,如果您的阶段正在工作并处理输入并返回 true,那么您的手势检测器将不会调用各种函数。

    如果您希望舞台和手势检测器都工作,那么永远不要从手势监听器和舞台中的任何函数返回 true


    InputMultiplexer multiplexer = new InputMultiplexer();
    multiplexer.addProcessor(new MyUiInputProcessor());
    multiplexer.addProcessor(new MyGameInputProcessor());
    Gdx.input.setInputProcessor(multiplexer);
    

    InputMultiplexer 会将任何新事件交给添加到它的第一个 InputProcessor。如果该处理器从为处理事件而调用的方法返回 false,这表明该事件未被处理,并且多路复用器将把该事件交给链中的下一个处理器。通过这种机制,MyUiInputProcessor 可以处理落在其中一个小部件中的任何事件,并将任何其他事件传递给 MyGameInputProcessor。

    Libgdx Wiki InputEvent

    【讨论】:

    • 但是如果我将这两个处理器返回为 false,我的手指从按钮上抬起后我的角色不会停止移动。我尝试过这个。在我的舞台上,我有一个带有 InputListener 的按钮,它会触发角色的移动,但是当我抬起手指时,他会继续移动。 P.S:我的 InputListener 中有 touchUp,当我返回 true 时它工作正常
    【解决方案2】:

    那么不要使用输入多路复用器,而是使用以下代码:

    public class MyGestureDetector extends GestureDetector {
        public MyGestureDetector(GestureListener listener) {
            super(listener);
        }
    
        @Override
        public boolean touchUp(float x, float y, int pointer, int button) {
            super.touchUp(x, y, pointer, button);
    
            // Your Code Here
            return true;
        }
    }
    

    类似地,可以在这里添加其他功能,例如 touchdown 等,不要忘记从功能中调用 super,因为这将使各种功能(如 fling 和 tap)工作

    编辑:

    将实现更改为

    public class MyGestureDetector extends GestureDetector {
        private Stage stage;
        public MyGestureDetector(GestureListener listener,Stage stage) {
            super(listener);
            this.stage = stage;
        }
    
    
        @Override
        public boolean keyDown(int keycode) {
            stage.keyDown(keycode);
            super.keyDown(keycode);
            return false;
        }
    
        @Override
        public boolean keyUp(int keycode) {
            stage.keyUp(keycode);
            super.keyUp(keycode);
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public boolean keyTyped(char character) {
            // TODO Auto-generated method stub
            stage.keyTyped(character);
            super.keyTyped(character);
            return false;
        }
    
        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button) {
            stage.touchDown(screenX, screenY, pointer, button);
            super.touchDown(screenX, screenY, pointer, button);
            return false;
        }
    
        @Override
        public boolean touchUp(int screenX, int screenY, int pointer, int button) {
            stage.touchUp(screenX, screenY, pointer, button);
            super.touchUp(screenX, screenY, pointer, button);
            return false;
        }
    
        @Override
        public boolean touchDragged(int screenX, int screenY, int pointer) {
            // TODO Auto-generated method stub
            stage.touchDragged(screenX, screenY, pointer);
            super.touchDragged(screenX, screenY, pointer);
    
            return false;
        }
    
        @Override
        public boolean mouseMoved(int screenX, int screenY) {
            stage.mouseMoved(screenX, screenY);
            super.mouseMoved(screenX, screenY);
            return false;
        }
    
        @Override
        public boolean scrolled(int amount) {
            stage.scrolled(amount);
            super.scrolled(amount);
            // TODO Auto-generated method stub
            return false;
        }
    
    
    }
    

    这里的 stage 是 scene2d Stage,根据您使用的 libgdx 版本,参数中可能存在一些 float 或 int 错误,这是用 0.9.9 nightlies 编写的

    P.S.- 此实现是根据您的问题定制的,但应该尝试通过返回 true 或 false 来处理每个案例,如前所述

    【讨论】:

    • 对不起,但我没有得到我称之为 fling 等的部分。你能向我解释一下这将如何工作,因为我只是感兴趣。在我完成这个类之后,我只是将它设置为 InputProcessor?它可以与舞台一起使用吗?我迷路了。非常感谢您的帮助。
    • 我的意思是添加一个按钮监听器。
    • 这是我到目前为止所做的:我创建了一个 GestureListener 类,我在其中描述了投掷行为,我还创建了一个 GestureDetector 类,就像你描述的那样,然后在我的 GameScreen 中我这样做了:@ 987654323@and 手势似乎有效。所以我认为现在的问题是如何将它添加到按钮侦听器中。如果我错了,请纠正我。谢谢
    • ButtonListner 是你自己的自定义按钮列表器还是你已经为它实现了一个 scene2d 阶段
    • 我在我的 scene2d 阶段添加了一个表格,并添加了带有标准输入侦听器的默认文本按钮。那里没有什么定制的。
    【解决方案3】:

    ActorGestureListener 在某些情况下的帮助:

            this.ball.addListener(new ActorGestureListener() {
                public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
                }
                public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                }
                public void tap(InputEvent event, float x, float y, int count, int button) {
                }
                public boolean longPress(Actor actor, float x, float y) {
                    return false;
                }
                public void fling(InputEvent event, float velocityX, float velocityY, int button) {
                }
                public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) {
                }
                public void zoom(InputEvent event, float initialDistance, float distance) {
                }
                public void pinch(InputEvent event, Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2) {
                }
            });
    

    其中“ball”是一个 Actor。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多