如何限制触摸板旋钮仅沿水平轴移动
How to restrict touchpad knob movement along horizontal axis only
我希望 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);
我相信没有方便的解决方案。我只能想到实现这种行为的一种可能方法 - 在 touchPad
中添加 InputListener
并在通知其他听众之前更正 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
将用于在 touchpad
之后通知 Actors
。但我认为这在大多数情况下是可以接受的,除此之外,这应该可行。
我希望 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);
我相信没有方便的解决方案。我只能想到实现这种行为的一种可能方法 - 在 touchPad
中添加 InputListener
并在通知其他听众之前更正 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
将用于在 touchpad
之后通知 Actors
。但我认为这在大多数情况下是可以接受的,除此之外,这应该可行。