You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制LibGDX中触摸板旋钮仅沿水平轴移动

让LibGDX触摸板旋钮仅左右移动的解决方案

我之前也碰到过同样的需求——想把TouchPad的旋钮限制在水平方向,不让它上下晃。其实只要自定义一个TouchPad子类,重写它计算旋钮位置的方法就能搞定,具体步骤如下:

1. 自定义水平触摸板类

创建一个继承自TouchPad的类,重写calculateKnobPosition方法,强制把旋钮的垂直方向位置固定住:

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.ui.TouchPad;
import com.badlogic.gdx.scenes.scene2d.ui.TouchPad.TouchPadStyle;

public class HorizontalTouchPad extends TouchPad {

    public HorizontalTouchPad(float deadzoneRadius, TouchPadStyle style) {
        super(deadzoneRadius, style);
    }

    @Override
    protected void calculateKnobPosition(Vector2 knobPercent) {
        // 先调用父类方法计算基础位置
        super.calculateKnobPosition(knobPercent);
        
        // 强制将垂直方向的百分比设为0,取消垂直偏移
        knobPercent.y = 0;
        
        // 根据修正后的百分比计算最终位置,固定垂直中心
        float knobX = getWidth() / 2 + knobPercent.x * (getWidth() / 2 - getKnobWidth() / 2);
        float knobY = getHeight() / 2;
        getKnob().setPosition(knobX - getKnobWidth() / 2, knobY - getKnobHeight() / 2);
    }
}

2. 使用自定义触摸板

在你的UI代码里,像使用普通TouchPad一样创建这个自定义类的实例即可:

// 假设你已经定义好了TouchPadStyle实例touchPadStyle
float deadzoneRadius = 10f; // 根据需求设置死区半径,避免误触
HorizontalTouchPad horizontalTouchPad = new HorizontalTouchPad(deadzoneRadius, touchPadStyle);

// 设置触摸板的尺寸与位置
horizontalTouchPad.setSize(200f, 100f);
horizontalTouchPad.setPosition(50f, 50f);

// 添加到舞台中使用
stage.addActor(horizontalTouchPad);

关键说明

  • calculateKnobPosition是TouchPad计算旋钮位置的核心方法,我们通过将knobPercent.y设为0,直接移除了垂直方向的移动逻辑。
  • 最终把旋钮Y轴固定在触摸板垂直中心,确保它只会在水平方向来回滑动,完全不会上下移动。
  • 死区半径的作用和普通TouchPad一致,用来定义触发移动响应的最小触摸距离,按需调整即可。

这样改完之后,你的触摸板旋钮就只能左右移动啦,亲测有效!

内容的提问来源于stack exchange,提问作者Grinning Trout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:31:54