Как ограничить движение ручки тачпада только по горизонтальной оси

Я хочу, чтобы моя ручка тачпада в LibGDX могла двигаться вправо или влево, но не вверх или вниз. Вот мой код:

Drawable touchBackground = touchpadSkin.getDrawable("touchBackground");
touchKnob = touchpadSkin.getDrawable("touchKnob");
touchpadStyle.background = touchBackground;
touchpadStyle.knob = touchKnob;
touchKnob.setMinHeight(80);
touchKnob.setMinWidth(30);

touchpad = new Touchpad(0.1f, touchpadStyle);
touchpad.setBounds(10, 100, 130, 130);
touchpad.getResetOnTouchUp();

ScrollPane scrollPane=new ScrollPane();
touchpad.setPosition(70,70);
touchpad.setOriginX(200);

stage.addActor(touchpad);
Gdx.input.setInputProcessor(stage);

person Grinning Trout    schedule 04.02.2018    source источник


Ответы (1)


Я считаю, что нет удобного решения. Я могу придумать только один возможный способ добиться такого поведения - добавить InputListener к touchPad и исправить координаты InputEvent до того, как другие слушатели будут уведомлены:

final Touchpad touchpad = ...;

// insert the listener before other listeners
// to correct InputEvent coordinates before they are notified
touchpad.getListeners().insert(0, new InputListener() {

    private Vector2 tmpVec = new Vector2();

    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
        if (touchpad.isTouched()) return false;
        restrictAlongX(event);
        return true;
    }

    @Override
    public void touchDragged(InputEvent event, float x, float y, int pointer) {
        restrictAlongX(event);
    }

    @Override
    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
        restrictAlongX(event);
    }

    private void restrictAlongX(InputEvent inputEvent) {
        // convert local centerY to the stage coordinate system
        tmpVec.set(0f, touchpad.getHeight() / 2);
        touchpad.localToStageCoordinates(tmpVec);

        // set stageY to the touchpad centerY
        inputEvent.setStageY(tmpVec.y);
    }
});

Конечно, это не выглядит красиво, и, возможно, кто-то предложит более чистое решение. Вы должны знать, что он изменяет InputEvent координаты, и тот же самый InputEvent будет использоваться для уведомления Actors после touchpad. Но я думаю, что это приемлемо в большинстве случаев, а в остальном это должно работать.

person Arctic45    schedule 04.02.2018