• 9.2.2、Libgdx的输入处理之事件处理


    (官网:www.libgdx.cn

    事件处理可以更加准确的获取用户的输入。事件处理提供了一种可以通过用户接口进行交互的方法。比如按下、释放一个按钮。

    输入处理

    事件处理通过观察者模式来完成。首先,需要实现InputProcessor接口:

    public class MyInputProcessor implements InputProcessor {
    @Override
    public boolean keyDown (int keycode) {
    return false;
    }
    @Override
    public boolean keyUp (int keycode) {
    return false;
    }
    @Override
    public boolean keyTyped (char character) {
    return false;
    }
    @Override
    public boolean touchDown (int x, int y, int pointer, int button) {
    return false;
    }
    @Override
    public boolean touchUp (int x, int y, int pointer, int button) {
    return false;
    }
    @Override
    public boolean touchDragged (int x, int y, int pointer) {
    return false;
    }
    @Override
    public boolean mouseMoved (int x, int y) {
    return false;
    }
    @Override
    public boolean scrolled (int amount) {
    return false;
    }
    }

    前三个方法允许你监听键盘事件:

    • keyDown():当一个按键按下时触发。返回key code,查阅点击

    • keyUp():当一个按键释放时触发。返回key code。

    • keyTyped():当一个Unicode字符通过键盘输入获得时生成。

    接下来的三个方法报告鼠标或触摸事件:

    • touchDown():当手指按到屏幕上时或鼠标按下时触发该事件。报告坐标、指针索引和鼠标按键(触摸操作默认左键)。

    • touchUp():当手机从屏幕释放或者鼠标释放时调用。报告最后的坐标、指针索引和鼠标按键(触摸默认左键)。

    • touchDragged():当手指在屏幕上拖动或鼠标在屏幕上拖动时触发该事件。返回坐标和指针索引。鼠标按键将不会返回。

    • mouseMoved():当鼠标在屏幕上移动并没有按键按下时触发。这个方法仅仅适用于桌面环境。

    • scrolled():鼠标滑轮滚动时触发。返回1或-1。不能在触摸屏中触发。

    每个方法返回一个布尔类型。我将在之后解释原因。

    一旦你自己实现InputProcessor接口,你必须告诉Libgdx:

    MyInputProcessor inputProcessor = new MyInputProcessor();
    Gdx.input.setInputProcessor(inputProcessor);

    这样的话,所有的输入事件都会放到MyInputProcessor实例中。在ApplicationListener.render()之前调用。

    InputAdapter

    InputAdapter实现了InputProcessor接口,并在每个方法中返回false。你可以对InputAdapter进行扩展。这样,你就可以实现你需要的方法。你同样可以使用一个匿名类。

    Gdx.input.setInputProcessor(new InputAdapter () {
    public boolean touchDown (int x, int y, int pointer, int button) {
    // 你的代码
    return true;
    }

    public boolean touchUp (int x, int y, int pointer, int button) {
    // 你的代码
    return true;
    }
    });

    InputMultiplexer

    有时,你需要控制InputProcessor。比如应用UI线程优先,输入事件处理次之。你可以通过InputMultiplexer类来实现:

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

    InputMultiplexer将会处理第一个添加的InputProcessor的所有的新的事件。如果这个InputProcessor返回false。将会处理下一个InputProcessor。

    持续输入处理实例

    如果你向通过Input Processor移动一个actor,你需要注意的是之后在按下后才会处理,要想持续处理输入,或者移动精灵,你可以添加一个flag到你的actor中。

    public class Bob
    {
    boolean leftMove;
    boolean rightMove;
    ...
    updateMotion()
    {
    if (leftMove)
    {
    x -= 5 * Gdx.graphics.getDeltaTime();
    }
    if (rightMove)
    {
    x += 5 * Gdx.graphics.getDeltaTime();
    }
    }
    ...
    public void setLeftMove(boolean t)
    {
    if(rightMove && t) rightMove = false;
    leftMove = t;
    }
    public void setRightMove(boolean t)
    {
    if(leftMove && t) leftMove = false;
    rightMove = t;
    }

    接下来,如下处理:

    ...
    @Override
    public boolean keyDown(int keycode)
    {
    switch (keycode)
    {
    case Keys.LEFT:
    bob.setLeftMove(true);
    break;
    case Keys.RIGHT:
    bob.setRightMove(true);
    break;
    }
    return true;
    }
    @Override
    public boolean keyUp(int keycode)
    {
    switch (keycode)
    {
    case Keys.LEFT:
    bob.setLeftMove(false);
    break;
    case Keys.RIGHT:
    bob.setRightMove(false);
    break;
    }
    return true;
    }

    www.libgdx.cn版权所有,如需转载,注明出处)

  • 相关阅读:
    vue 快速开发
    java 查es
    es filter 的使用
    es查询例子
    es的基本查询
    linux top命令VIRT,RES,SHR,DATA的含义
    Redis和MC的对比
    决TIME_WAIT过多造成的问题
    MariaDB yum 安装
    more 命令相关
  • 原文地址:https://www.cnblogs.com/hainange/p/6153497.html
Copyright © 2020-2023  润新知