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
相关产品推荐
相关产品推荐

