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

LibGDX中PLAY按钮触摸坐标Y轴倒置及尺寸匹配问题排查

LibGDX触摸坐标Y轴倒置&数值不匹配问题解决

核心问题

你的问题本质是屏幕坐标系(Y轴向下)与游戏世界坐标系(Y轴向上)方向不一致,加上手动转换坐标的逻辑错误,导致触摸区域判断完全错位,和LibGDX版本关系不大。

解决方案

1. 使用Viewport的unproject方法转换坐标

LibGDX的Viewport自带坐标转换功能,能自动处理屏幕到游戏世界的映射,包括Y轴倒置、缩放、拉伸等场景,完全不需要手动计算。

2. 简化触摸区域判断逻辑

先将触摸点转换到游戏世界坐标系,再直接与按钮的世界坐标区域对比,逻辑更清晰不易出错。

3. 清理代码冗余

  • 连续设置两次batch.setProjectionMatrix会导致前一次设置无效,需删除冗余项;
  • 按钮的绘制坐标可以用变量存储,方便后续触摸判断时复用。

修改后的关键代码片段

触摸处理部分修改

if(Gdx.input.isTouched()){
    // 提前初始化触摸向量,避免每次触摸新建对象
    if(touchPosition == null) touchPosition = new Vector2();
    touchPosition.set(Gdx.input.getX(), Gdx.input.getY());
    
    // 用gamePort将屏幕坐标转换为游戏世界坐标
    gamePort.unproject(touchPosition);
    
    // 计算按钮在世界坐标系的位置和尺寸
    float btnX = LearningLetters.V_WIDTH/2 + 64;
    float btnY = LearningLetters.V_HEIGHT/2 - 64/2;
    float btnWidth = playButton.getWidth();
    float btnHeight = playButton.getHeight();
    
    // 判断触摸点是否在按钮区域内
    if (touchPosition.x > btnX && touchPosition.x < btnX + btnWidth 
        && touchPosition.y > btnY && touchPosition.y < btnY + btnHeight) {
        System.out.println("触摸到按钮,世界坐标:" + touchPosition);
    }
}

渲染部分冗余清理

删除重复的投影矩阵设置,保留正确的即可:

// 删除冗余的waterCam投影矩阵设置
// batch.setProjectionMatrix(waterCam.combined);
batch.setProjectionMatrix(gamecam.combined);
rendererWater.render();
renderer.render();

额外优化建议

  • 在构造方法中提前初始化touchPosition,减少内存开销;
  • 按钮的位置和尺寸可以定义为成员变量,便于统一修改;
  • 测试时可以在按钮周围绘制矩形边框,直观验证触摸区域是否匹配。

内容的提问来源于stack exchange,提问作者Ohad Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 03:23:30