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

如何设置已旋转LibGDX Actor的拖拽位置?

解决LibGDX旋转Actor后拖拽位置偏移问题

核心原因

未旋转时固定偏移计算可生效,但Actor旋转后局部坐标系发生旋转变换,原有偏移公式未适配该变换,导致位置错位。

解决方案

利用LibGDX内置坐标转换方法自动适配Actor的旋转、缩放等变换,同时同步拖拽Actor的旋转状态,实现触摸点与拖拽位置精准重合:

  1. 获取触摸点的局部坐标
    在拖拽开始时,将屏幕触摸坐标转换为原Actor的局部坐标,该转换会自动处理Actor的所有变换逻辑:

    // 获取屏幕触摸坐标
    Vector2 screenTouchPos = new Vector2(event.getStageX(), event.getStageY());
    // 转换为原Actor的局部坐标(自动适配旋转、缩放)
    Vector2 localTouchPos = sourceImage.screenToLocalCoordinates(screenTouchPos);
    
  2. 设置拖拽Actor的位置偏移
    通过计算得到的局部坐标,设置拖拽Actor相对于触摸点的偏移,确保触摸点与Actor对应位置重合:

    dragAndDrop.setDragActorPosition(-localTouchPos.x, -localTouchPos.y);
    
  3. 同步拖拽Actor的旋转与原点
    让拖拽Actor的旋转角度、原点与原Actor保持一致,避免因方向错位导致的位置错觉:

    Image dragActor = new Image(sourceImage.getDrawable());
    // 同步旋转角度
    dragActor.setRotation(sourceImage.getRotation());
    // 同步原点设置(若原Actor修改过原点)
    dragActor.setOrigin(sourceImage.getOriginX(), sourceImage.getOriginY());
    

完整代码示例

@Override
public DragAndDrop.Payload dragStart(InputEvent event, float x, float y, int pointer) {
    // 获取触摸点局部坐标
    Vector2 screenTouchPos = new Vector2(event.getStageX(), event.getStageY());
    Vector2 localTouchPos = sourceImage.screenToLocalCoordinates(screenTouchPos);

    // 设置拖拽位置偏移
    dragAndDrop.setDragActorPosition(-localTouchPos.x, -localTouchPos.y);

    // 创建并配置拖拽Actor
    Image dragActor = new Image(sourceImage.getDrawable());
    dragActor.setRotation(sourceImage.getRotation());
    dragActor.setOrigin(sourceImage.getOriginX(), sourceImage.getOriginY());

    // 组装返回Payload
    DragAndDrop.Payload payload = new DragAndDrop.Payload();
    payload.setDragActor(dragActor);
    return payload;
}

为什么之前的方法失效?

  • localToParentCoordinates是局部坐标转父节点坐标,与我们需要的屏幕坐标转局部坐标方向相反,无法直接用于偏移计算。
  • 手动旋转矩阵易遗漏Actor原点、缩放等参数,导致计算偏差,而LibGDX内置坐标转换方法已封装所有变换逻辑,准确性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:30:46