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

LibGDX Actor鼠标点击识别位置异常问题求助

解决Stage中UI与战斗场景点击偏移的问题

看起来你遇到的核心问题是绘制坐标和点击检测坐标不匹配——你手动给Actor的绘制位置加了230px偏移,但点击检测逻辑没同步处理这个偏移,或者是你没正确利用Group的坐标变换能力,反而用手动偏移导致了混乱。下面是几个针对性的解决方案:

方案一:正确设置BattleSceneGroup的位置(推荐)

不要手动给每个Actor加y偏移,而是直接把BattleSceneGroup的y坐标设为230px,这样Group里所有Actor的本地坐标(y=0)就会自动对应屏幕的y=230位置,绘制和点击检测都会自动同步:

// 以常见的2D游戏框架为例,逻辑通用
BattleSceneGroup battleGroup = new BattleSceneGroup();
battleGroup.setY(230); // 直接把整个战斗场景组往下移230px
stage.addActor(battleGroup);

// 后续添加Actor时,直接用本地坐标即可,无需手动加偏移
Actor enemy = new EnemyActor();
enemy.setPosition(100, 0); // 这个y=0会自动对应屏幕的y=230位置
battleGroup.addActor(enemy);

这种方式能让所有坐标逻辑统一,点击检测会自动使用Group变换后的全局坐标,彻底避免偏移问题。

方案二:同步点击检测的坐标偏移

如果因为项目限制必须手动给Actor加绘制偏移,那一定要在点击检测时对触摸坐标做反向调整:

// 在Actor的触摸事件处理方法中调整坐标
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
    // 把触摸的全局坐标转换为Actor的本地坐标时,减去手动添加的230px偏移
    float adjustedY = y - 230;
    // 用调整后的坐标判断是否点击到Actor边界
    return getBoundingRectangle().contains(x, adjustedY);
}

不过这种方法需要给每个Actor单独处理,容易遗漏,不如方案一简洁可靠。

排查额外偏移的深层原因

你提到点击边界偏移了约300px(比230多了70),可能还有其他隐藏因素:

  • 检查UIGroup是否设置了额外的padding、margin,导致它实际占据的高度超过230px
  • 确认Stage的视口(Viewport)设置是否正确,比如是否存在缩放、坐标原点(左上角/左下角)的差异
  • 检查BattleSceneGroup本身是否有缩放、旋转等变换操作,这些都会干扰点击检测的坐标计算

总结来说,最稳妥的方式是利用Group的坐标变换来整体偏移,而非手动修改每个Actor的绘制坐标,这样能保证绘制和点击检测的坐标系统完全对齐。

内容的提问来源于stack exchange,提问作者Jaroslav Gorshkov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:03:06